কোনও সি ++ ফাংশন কনটেক্সপ্রপ চিহ্নিত করা কি কখনও খারাপ?


26

একটি খুব তুচ্ছ ফাংশন দেওয়া,

int transform(int val) {
    return (val + 7) / 8;
}

এটি খুব সুস্পষ্ট হওয়া উচিত যে ভেরিয়েবলগুলি constexprসংজ্ঞায়িত করার সময় আমাকে এই ফাংশনটি কোনও ফাংশনে রূপান্তর করা সহজ , এটির constexprমতো করে:

constexpr int transform(int val) {
    return (val + 7) / 8;
}

আমার ধারণাটি হ'ল এটি কঠোরভাবে একটি উন্নতি, যেহেতু ফাংশনটি এখনও একটি অ- constexprপ্রসঙ্গে বলা যেতে পারে এবং এটি এখন সংকলন-সময় ধ্রুবক পরিবর্তনগুলি সংজ্ঞায়িত করতেও ব্যবহৃত হতে পারে।

আমার প্রশ্ন হ'ল, এমন পরিস্থিতি রয়েছে যেখানে এটি একটি খারাপ ধারণা? যেমন, এই ফাংশনটি তৈরি করে constexpr, আমি কি কখনও এমন পরিস্থিতির মুখোমুখি হতে পারি যে কোনও নির্দিষ্ট পরিস্থিতিতে এই ফাংশনটি আর ব্যবহারযোগ্য হবে না, বা যেখানে এটি খারাপ ব্যবহার করবে?


1
কেবলমাত্র আমিই মনে করতে পারি বাগ সংকলনকারী। এটি সম্ভবত সম্ভব যে পুনরাবৃত্তিমূলক কনসটেক্সার্প ফাংশন কল মেমরি ক্রাশের কারণে খুব ধীর সংকলন পদক্ষেপ বা এমনকি একটি সংকলকও তৈরি করতে পারে।
জ্যান লিংস

উত্তর:


19

এটি কেবল তখনই গুরুত্বপূর্ণ যদি ফাংশনটি সর্বজনীন ইন্টারফেসের অংশ হয় এবং আপনি আপনার এপিআই-র ভবিষ্যতের সংস্করণগুলি বাইনারি-সামঞ্জস্য রাখতে চান। সেক্ষেত্রে আপনার কীভাবে আপনি আপনার এপিআই বিকাশ করতে চান এবং ভবিষ্যতের পরিবর্তনের জন্য আপনাকে যেখানে এক্সটেনশন পয়েন্টগুলি দরকার তা সতর্কতার সাথে ভাবতে হবে।

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

তার মানে আপনি বাঞ্ছনীয় ব্যবহার করা উচিত constexprফাংশন যে জন্য মজ্জাগতভাবে বিশুদ্ধ ফাংশন, এবং যে আসলে কম্পাইল সময়ে দরকারী হবে (যেমন টেমপ্লেট metaprogramming জন্য)। কেবলমাত্র বর্তমান বাস্তবায়নটি কনস্টেক্সপ্রে-সক্ষম হওয়ার কারণে ফাংশনগুলি কনটেক্সপ্রপ তৈরি করা ভাল হবে না।

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

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


12

একটি ফাংশন হিসাবে চিহ্নিত করে constexprএটিকে একটি ইনলাইন ফাংশনও করে তোলে § [dcl.constexpr] / 1:

কনস্টেক্সপ্রাইফ স্পেসিফায়ারের সাথে ঘোষিত একটি ফাংশন বা স্থিতিশীল ডেটা সদস্য স্পষ্টতই একটি ইনলাইন ফাংশন বা পরিবর্তনশীল (.1.১..1)।

inlineপরিবর্তে, এর অর্থ হল আপনার ব্যবহৃত প্রতিটি অনুবাদ ইউনিটে সেই ফাংশনের সংজ্ঞা অন্তর্ভুক্ত করা দরকার। মূলত এর অর্থ constexprফাংশনগুলি হ'ল :

  1. একটি অনুবাদ ইউনিটে ব্যবহারের মধ্যে সীমাবদ্ধ, বা
  2. একটি শিরোনামে সংজ্ঞায়িত।

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

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

একটি constexprফাংশন কিছু উপায়েও সীমাবদ্ধ, তাই কিছু ফাংশনগুলির জন্য এটি কোনও বিকল্প নয়। বিধিনিষেধগুলির মধ্যে রয়েছে:

  1. ভার্চুয়াল ফাংশন হতে পারে নাconstexpr
  2. এর রিটার্ন টাইপ অবশ্যই একটি 'আক্ষরিক প্রকার' হতে হবে (উদাঃ, অ ত্রিভোজী কর্টর বা ডিটারগুলি সহ কোনও বস্তু নয়)।
  3. এর সমস্ত পরামিতি অবশ্যই আক্ষরিক ধরণের হওয়া উচিত।
  4. ফাংশন বডি একটি tryব্লক থাকতে পারে না ।
  5. এটিতে অক্ষরহীন প্রকারের একটি চলক সংজ্ঞা বা স্থির বা থ্রেড স্টোরেজ সময়কাল সহ কোনও কিছুই থাকতে পারে না।

আমি দু'জনকে বরং অস্পষ্ট জিনিস এড়িয়ে গিয়েছি (উদাহরণস্বরূপ, এটিতে একটি gotoবা একটি asmবিবৃতিও থাকতে পারে না ) তবে আপনি ধারণাটি পেয়ে যান - বেশ কয়েকটি জিনিসের জন্য এটি কার্যকর হবে না।

নীচের লাইন: হ্যাঁ, বেশ কয়েকটি পরিস্থিতি রয়েছে যেখানে এটি একটি খারাপ ধারণা।


"এটি ভার্চুয়াল হওয়া উচিত না (সি ++ ২০ অবধি)" আমি ভাবছি কীভাবে ভার্চুয়াল ফাংশনটি কনটেক্সপ্রপ হতে পারে? সংকলকরা কী করে?
বিশৃঙ্খলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.