সি ++ এ "একটি ক্রিয়াকলাপে বিষ প্রয়োগ" এর অর্থ কী?


96

সিপিসকনে স্কট শুরারের আলোচনার "পরিচয় constexpr" এর একেবারে শেষে , তিনি জিজ্ঞাসা করেছেন "কোনও ফাংশনে বিষ দেওয়ার কোনও উপায় আছে"? তারপরে তিনি ব্যাখ্যা করেন যে এটি করা যেতে পারে (একটি মানহীন উপায়ে হলেও):

  1. throwএকটি constexprফাংশন একটি রাখা
  2. অমীমাংসিত ঘোষণা করে extern const char*
  3. মধ্যে অমীমাংসিত উল্লেখ externকরেthrow

আমি বুঝতে পারি যে আমি এখানে আমার গভীরতার বাইরে কিছুটা হলেও আমি কৌতূহলী:

  • "কোন ক্রিয়াকলাপে বিষ" অর্থ কি?
  • তিনি যে কৌশলটির উল্লেখ করেছেন তার তাত্পর্য / তাত্পর্য কী?

4
এই শব্দটি সম্পর্কে কখনও শুনিনি, একটি সংক্ষিপ্ত উদাহরণ দিয়ে স্পষ্ট করুন!
ῥεῖ

6
@।, আমি কেবল স্পষ্ট করে দিয়েছি। এই শব্দটি 'ছোট চেনাশোনাগুলিতে ব্যাপকভাবে পরিচিত'
সের্গেইএ

4
constexprফাংশনের প্রতিটি কল সংকলন সময়ে মূল্যায়ন করা হয়েছে তা নিশ্চিত করার বিষয়ে কথা বলছেন তিনি ।
টিসি

@ টিটিসি রাইট - তিনি উল্লেখ করেছিলেন যে কোনও constexprফাংশনটি সংকলন সময়ে বা রান সময়ে ব্যবহৃত হতে পারে। সুতরাং এটি জোর করার একটি উপায় যা আপনি রান সময়ে এটি ব্যবহার করতে পারবেন না? কখন তা কাজে লাগে?
সুডো

4
বিশেষত সি ++ 11 এ, constexprবাধাগুলির কারণে কোনও ফাংশন প্রায়শই সর্বাধিক দক্ষ বাস্তবায়ন হয় না, তাই কেউ রান সময় এটির মূল্যায়ন করতে না চাইতে পারে; বা, হতে পারে এটি ত্রুটির ক্ষেত্রে (যেমন তার উদাহরণ হিসাবে)।
টিসি

উত্তর:


106

সাধারণভাবে এটি কোনও ফাংশনকে অকেজো করার উপযোগী বোঝায়, যেমন আপনি যদি কোনও প্রোগ্রামে গতিশীল বরাদ্দ ব্যবহার নিষিদ্ধ করতে চান তবে আপনি mallocফাংশনটিকে "বিষ" দিতে পারেন যাতে এটি ব্যবহার করা যায় না।

ভিডিওতে তিনি এটিকে আরও সুনির্দিষ্ট উপায়ে ব্যবহার করছেন, যা ফাংশনটিতে বিষ প্রয়োগের কথা বলার সময় প্রদর্শিত স্লাইডটি পড়লে আপনি স্পষ্ট হন, যেটি বলে যে "শুধুমাত্র সংকলন-সময়কে বাধ্য করার উপায়?"

সুতরাং রান-টাইমে এটিকে অগ্রহণযোগ্য করার জন্য তিনি ফাংশনটিকে "বিষাক্ত" করার বিষয়ে কথা বলছেন, তাই এটি কেবল ধ্রুবক অভিব্যক্তিতে ডাকে । কৌশলটি হ'ল ফাংশনে একটি শাখা থাকা যা কখনই সংকলন-সময় প্রসঙ্গে ডাকা হয় না এবং সেই শাখাকে এমন কিছু ধারণ করে যা ত্রুটির কারণ হতে পারে।

throwকনসেক্সট্রপ ফাংশনে একটি অভিব্যক্তি অনুমোদিত, যতক্ষণ না এটি ফাংশনের সংকলন-সময় অনুরোধের সময় পৌঁছানো হয় না (কারণ আপনি সংকলন-সময় ব্যতিক্রম করতে পারেন না, এটি মেমরি বরাদ্দ করার মতো একটি সহজাত গতিশীল অপারেশন)। সুতরাং একটি থ্রো এক্সপ্রেশন যা সংজ্ঞায়িত প্রতীককে নির্দেশ করে সংকলন-সময় আমন্ত্রণগুলির সময় ব্যবহার করা হবে না (কারণ এটি সংকলন করতে ব্যর্থ হবে) এবং রান-টাইমে ব্যবহার করা যাবে না কারণ অপরিজ্ঞাত চিহ্নটি লিঙ্কারের ত্রুটির কারণ ঘটায়।

ফাংশনের সংকলন-সময় আমন্ত্রণগুলিতে অপরিজ্ঞাত চিহ্নটি "অর-ব্যবহৃত" নয়, বাস্তবে সংকলক প্রতীকটির জন্য কোনও রেফারেন্স তৈরি করে না, সুতরাং এটি ঠিক আছে যে এটি অপরিজ্ঞাত।

এটা কি দরকারী? তিনি এটি প্রদর্শন করছেন যে এটি কীভাবে করবেন, অগত্যা এটি ভাল ধারণা বা ব্যাপকভাবে দরকারী। যদি আপনার কোনও কারণে করার প্রয়োজন হয় তবে তার কৌশলটি আপনার সমস্যার সমাধান করতে পারে। আপনার যদি এটির প্রয়োজন না হয় তবে আপনার এটি নিয়ে চিন্তা করার দরকার নেই।

এটি কার্যকর হতে পারে এমন একটি কারণ হ'ল যখন কোনও কোনও ক্রিয়াকলাপের সময় সংস্করণটি তার মতো দক্ষ না হয়। কনটেক্সপ্রপ ফাংশনে (যেমন C ++ 11, কিছুটা বিধিনিষেধ C ++ 14 এ মুছে ফেলা হয়েছিল) এ জাতীয় ধরণের অভিব্যক্তিগুলির অনুমতি রয়েছে on সুতরাং আপনার কাছে কোনও গণনা সম্পাদনের জন্য একটি ফাংশনের দুটি সংস্করণ থাকতে পারে, একটিটি সর্বোত্তম, তবে এমন একটি এক্সপ্রেশন ব্যবহার করে যা কনটেক্সট্রপ ফাংশনটিতে অনুমোদিত নয় এবং একটি যা বৈধ কনটেক্সারপ ফাংশন, তবে রান- এ ডাকা হলে খারাপ অভিনয় করতে হবে সময় রান-টাইম কলগুলির জন্য এটি কখনই ব্যবহার করা হবে না তা নিশ্চিত করার জন্য আপনি উপ-অনুকূলটিটিকে বিষ প্রয়োগ করতে পারেন, এটি নিশ্চিত করে যে রান-টাইম কলগুলির জন্য আরও দক্ষ (অ-কনস্টেক্সপ্র) সংস্করণ ব্যবহৃত হচ্ছে।

এনবি সংকলন সময়ে ব্যবহৃত একটি কনস্টেক্সপ্রেশ ফাংশনটির কার্য সম্পাদন সত্যই গুরুত্বপূর্ণ নয়, কারণ এতে কোনওভাবেই রান-টাইম ওভারহেড নেই। সংকলকটি অতিরিক্ত কাজ করে এটি আপনার সংকলনটি ধীর করতে পারে তবে এতে কোনও রান-টাইম পারফরম্যান্স ব্যয় হবে না।


4
আমি স্লাইডটির পাঠ্যটি পড়েছি, তবে তিনি যে শব্দটি ব্যবহার করছিলেন তার সংযোগটি আমি দেখতে পাইনি। এটি এখন সুস্পষ্ট যে আপনি এটি ব্যাখ্যা করেছেন, কিন্তু আমি এটি তখন দেখিনি। এই দুর্দান্ত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ - আমি কেবল এই ওয়েবসাইটটি পছন্দ করি।
sudo

@ প্রবাসীমীত, আপনার নিজের প্রশ্ন জিজ্ঞাসা করুন, অন্যরকমের বিষয়ে অন্যের প্রশ্নের মন্তব্য হাইজ্যাক করবেন না। একটি সহজ সমাধান হ'ল এটিকে প্রতিটি অনুবাদ ইউনিটে মুছে ফেলা হিসাবে সংজ্ঞায়িত করা বা এটি আপনার নিজের সংজ্ঞা দিয়ে প্রতিস্থাপন করা যা কোনও অনির্ধারিত চিহ্নকে উল্লেখ করে।
জোনাথন ওয়াকলি

17

'বিষাক্তকরণ' শনাক্তকারী বলতে বোঝায় যে 'বিষক্রিয়া' পরে সনাক্তকারীটির কোনও রেফারেন্স একটি হার্ড সংকলক ত্রুটি। উদাহরণস্বরূপ, কঠোর অবমূল্যায়নের জন্য এই কৌশলটি ব্যবহার করা যেতে পারে (ফাংশনটি হ্রাস করা হয়, এটি কখনই ব্যবহার করবেন না!)।

ইন জিসিসি ঐতিহ্যগতভাবে এই জন্য একটি pragma ছিল: #pragma GCC poison


4
হ্যাঁ, তবে সেই আলোচনায় ব্যবহৃত অর্থে একেবারেই নয়।
টিসি

@ টিটিসি, ঠিক আছে, উত্তর দেওয়ার আগে আমার সম্ভবত এটি দেখা উচিত :)
সের্গেইএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.