ভূমিকা
constexpr
বাস্তবায়নটি বলার উপায় হিসাবে প্রবর্তন করা হয়নি যে এমন কিছু প্রেক্ষাপটে মূল্যায়ন করা যেতে পারে যার জন্য ধ্রুবক-প্রকাশ প্রয়োজন ; মানানসই বাস্তবায়ন সি ++ 11 এর আগে এটি প্রমাণ করতে সক্ষম হয়েছে।
কিছু একটি বাস্তবায়ন প্রমাণ করতে পারে অভিপ্রায় কোডের একটি নির্দিষ্ট অংশ:
- এটি কী যে বিকাশকারী এই সত্তার সাথে প্রকাশ করতে চান?
- কাজটি ঘটে যাওয়ার কারণে কি আমাদের অন্ধভাবে কোডটি একটি ধ্রুবক-অভিব্যক্তিতে ব্যবহার করার অনুমতি দেওয়া উচিত ?
পৃথিবী ছাড়া কী হত constexpr
?
ধরা যাক আপনি একটি লাইব্রেরি বিকাশ করছেন এবং বুঝতে পারবেন যে আপনি বিরতিতে প্রতিটি পূর্ণসংখ্যার যোগফল গণনা করতে সক্ষম হতে চান (0,N]
।
int f (int n) {
return n > 0 ? n + f (n-1) : n;
}
অভিপ্রায় অভাব
একটি সংকলক সহজেই প্রমাণ করতে পারে যে উপরের ফাংশনটি ধ্রুবক-প্রকাশে কলযোগ্য করতে পারে যদি পাস করার জানা যায়; তবে আপনি এটিকে উদ্দেশ্য হিসাবে ঘোষণা করেননি - এটি ঘটনাটি ঘটেছে।
এখন অন্য কেউ আসেন, আপনার ফাংশনটি পড়েন, সংকলকের মতো একই বিশ্লেষণ করেন; " ওহ, এই ক্রিয়াটি ধ্রুবক-অভিব্যক্তিতে ব্যবহারযোগ্য!" , এবং নিম্নলিখিত কোড টুকরা লিখুন।
T arr[f(10)]; // freakin' magic
অপ্টিমাইজেশন
আপনি একজন "দুর্দান্ত" লাইব্রেরি বিকাশকারী হিসাবে সিদ্ধান্ত নেবেন যে f
প্রার্থনার সময় ফলাফলটি ক্যাশে করা উচিত; একই মানগুলি বারবার গণনা করতে চাইবে কে?
int func (int n) {
static std::map<int, int> _cached;
if (_cached.find (n) == _cached.end ())
_cached[n] = n > 0 ? n + func (n-1) : n;
return _cached[n];
}
ফলাফল
আপনার নিখুঁত অপ্টিমাইজেশন প্রবর্তন করে, আপনি কেবল আপনার ফাংশনটির প্রতিটি ব্যবহার ভেঙে ফেলেছেন যা এমন প্রসঙ্গে হয়েছে যেখানে একটি ধ্রুবক-প্রকাশ প্রয়োজন।
আপনি কখনও প্রতিশ্রুতি দেননি যে ক্রিয়াটি একটি ধ্রুবক-প্রকাশের ক্ষেত্রে ব্যবহারযোগ্য , এবং ছাড়া constexpr
এই জাতীয় প্রতিশ্রুতি দেওয়ার কোনও উপায় থাকবে না।
তাহলে, আমাদের কেন দরকার constexpr
?
প্রাথমিক ব্যবহার constexpr ঘোষণা হয় অভিপ্রায় ।
যদি কোনও সত্তা হিসাবে চিহ্নিত না হয় constexpr
- এটি কখনও ধ্রুবক-অভিব্যক্তিতে ব্যবহারের উদ্দেশ্যে নয় ; এবং তা থাকলেও, আমরা এই জাতীয় প্রসঙ্গটি নির্ণয়ের জন্য সংকলকটির উপর নির্ভর করি (কারণ এটি আমাদের উদ্দেশ্যকে উপেক্ষা করে)।
constexpr
? যদি তা হয় তবে আমি একটি ব্যবহার দেখতে পাচ্ছি।