व्याख्या
कुछ संकलक (विशेषकर जीसीसी) संकलन समय पर अभिव्यक्तियों का मूल्यांकन करते समय उच्च परिशुद्धता का उपयोग करते हैं। यदि कोई अभिव्यक्ति केवल निरंतर इनपुट और शाब्दिक पर निर्भर करती है, तो इसका मूल्यांकन संकलन समय पर किया जा सकता है, भले ही अभिव्यक्ति को एक कॉन्स्ट्रेक्स चर में न सौंपा गया हो। ऐसा होता है या नहीं, इस पर निर्भर करता है:
- अभिव्यक्ति की जटिलता
- संकलन समय का मूल्यांकन करने का प्रयास करते समय थ्रेशोल्ड कंपाइलर कटऑफ के रूप में उपयोग करता है
- विशेष मामलों में उपयोग की जाने वाली अन्य heuristics (जैसे कि जब क्लॉग एलॉप्स को हटाता है)
यदि एक अभिव्यक्ति स्पष्ट रूप से प्रदान की जाती है, जैसा कि पहले मामले में, इसकी कम जटिलता है और संकलक का संकलन समय पर इसका मूल्यांकन करने की संभावना है।
इसी तरह, यदि किसी फ़ंक्शन को इनलाइन चिह्नित किया जाता है, तो संकलक को संकलन समय पर इसका मूल्यांकन करने की अधिक संभावना होती है क्योंकि इनलाइन फ़ंक्शन उस सीमा को बढ़ाते हैं जिस पर मूल्यांकन हो सकता है।
उच्च-अनुकूलन स्तर भी इस सीमा को बढ़ाते हैं, जैसे -Ofast उदाहरण में, जहाँ उच्च परिशुद्धता संकलन-समय मूल्यांकन के कारण सभी अभिव्यक्तियाँ gcc पर सत्य का मूल्यांकन करते हैं।
हम कंपाइलर एक्सप्लोरर पर यहां इस व्यवहार का निरीक्षण कर सकते हैं। -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;
}
इस उदाहरण के विपरीत , जहां हम समान संकलक सेटिंग्स का उपयोग करते हैं लेकिन संकलन-समय पर मूल्य प्रदान करते हैं, जिसके परिणामस्वरूप उच्च-सटीक संकलन-समय मूल्यांकन होता है।