ব্যাখ্যা
কিছু সংকলক (উল্লেখযোগ্যভাবে জিসিসি) সংকলন সময়ে এক্সপ্রেশন মূল্যায়নের সময় উচ্চতর নির্ভুলতা ব্যবহার করে। যদি কোনও অভিব্যক্তি কেবল ধ্রুবক ইনপুট এবং আক্ষরিক উপর নির্ভর করে তবে সংকলন সময়ে এটি প্রকাশ করা যেতে পারে যদিও অভিব্যক্তিটি একটি কনস্টেক্সপ্র ভেরিয়েবলের জন্য নির্ধারিত করা হয় না। এটি ঘটে কিনা তা নির্ভর করে:
- ভাবের জটিলতা
- সংকলন সময় মূল্যায়ন করার চেষ্টা করার সময় সংকলকটি কাটফট হিসাবে সংক্ষিপ্তরটি ব্যবহার করে
- বিশেষ ক্ষেত্রে ব্যবহৃত অন্যান্য হিউরিস্টিক্স (যেমন যখন ক্ল্যাং এলিডগুলি লুপ হয়)
যদি প্রথম প্রকাশের মতো স্পষ্টরূপে কোনও অভিব্যক্তি সরবরাহ করা হয় তবে এর কম জটিলতা রয়েছে এবং সংকলকটি সংকলনের সময় এটির মূল্যায়ন করতে পারে।
একইভাবে, যদি কোনও ফাংশনটিকে ইনলাইন চিহ্নিত করা হয়, সংকলক সংকলনের সময় এটির মূল্যায়নের সম্ভাবনা বেশি কারণ ইনলাইন ফাংশন প্রান্তিককরণ উত্থাপন করে যেখানে মূল্যায়ন ঘটতে পারে।
উচ্চতর অপ্টিমাইজেশনের স্তরগুলিও এই প্রান্তিক প্রান্তকে বাড়িয়ে দেয়, যেমন- যথাযথ উদাহরণ হিসাবে, যেখানে উচ্চতর নির্ভুলতা সংকলন-সময় মূল্যায়নের কারণে সমস্ত এক্সপ্রেশন জিসিসি-তে সত্য হিসাবে মূল্যায়ন করে।
সংযোজক এক্সপ্লোরার এ আমরা এই আচরণটি পর্যবেক্ষণ করতে পারি। যখন -O1 দিয়ে সংকলিত হয় তখন কেবল ইনলাইন চিহ্নিত ফাংশনটি সংকলন-সময়ে মূল্যায়ন করা হয়, তবে -O3 এ উভয় ফাংশন সংকলন-সময়ে মূল্যায়ন করা হয়।
এনবি: সংকলক-এক্সপ্লোরার উদাহরণগুলিতে, আমি printfপরিবর্তে আইস্ট্রিম ব্যবহার করি কারণ এটি মূল ফাংশনের জটিলতা হ্রাস করে, প্রভাবটিকে আরও দৃশ্যমান করে তোলে।
যে inlineরানটাইম মূল্যায়ন প্রভাবিত করে না তা প্রদর্শন করে
আমরা নিশ্চিত করতে পারি যে স্ট্যান্ডার্ড ইনপুট থেকে মান অর্জন করে সংকলন সময়ে কোনওটিই এক্সপ্রেশনকে মূল্যায়ন করা হয় না এবং যখন আমরা এটি করি, সমস্ত 3 টি এক্সপ্রেশন এখানে প্রদর্শিত হিসাবে মিথ্যা প্রত্যাবর্তন করবে: https://ideone.com/QZbv6X
#include <cmath>
#include <iostream>
bool is_cube(double r)
{
return floor(cbrt(r)) == cbrt(r);
}
bool inline is_cube_inline(double r)
{
return floor(cbrt(r)) == cbrt(r);
}
int main()
{
double value;
std::cin >> value;
std::cout << (floor(cbrt(value)) == cbrt(value)) << std::endl;
std::cout << (is_cube(value)) << std::endl;
std::cout << (is_cube_inline(value)) << std::endl;
}
এই উদাহরণটির সাথে বৈসাদৃশ্য করুন যেখানে আমরা একই সংকলক সেটিংস ব্যবহার করি তবে সংকলন সময়ে মান সরবরাহ করি যার ফলে উচ্চতর নির্ভুলতা সংকলন-সময় মূল্যায়ন হয়।