जैसा कि अन्य उत्तरों में सभी पर्याप्त रूप से सुझाव दिए गए हैं, आप __builtin_expect
कंपाइलर को असेंबली कोड की व्यवस्था करने के बारे में संकेत देने के लिए उपयोग कर सकते हैं । जैसा कि आधिकारिक डॉक्स बताते हैं, ज्यादातर मामलों में, आपके मस्तिष्क में निर्मित कोडांतरक उतना अच्छा नहीं होगा जितना कि जीसीसी टीम द्वारा तैयार किया गया। अनुमान लगाने के बजाय अपने कोड को अनुकूलित करने के लिए वास्तविक प्रोफ़ाइल डेटा का उपयोग करना हमेशा सबसे अच्छा होता है।
समान पंक्तियों के साथ, लेकिन अभी तक उल्लेख नहीं किया गया है, एक जीसीसी-विशिष्ट तरीका है जो कंपाइलर को "ठंड" पथ पर कोड उत्पन्न करने के लिए मजबूर करता है। इसमें noinline
और cold
विशेषताओं का उपयोग शामिल है , जो ठीक उसी तरह करते हैं जैसे वे करते हैं। इन विशेषताओं को केवल फ़ंक्शन के लिए लागू किया जा सकता है, लेकिन C ++ 11 के साथ, आप इनलाइन लैम्ब्डा फ़ंक्शन घोषित कर सकते हैं और इन दो विशेषताओं को लैम्ब्डा फ़ंक्शन पर भी लागू किया जा सकता है।
यद्यपि यह अभी भी एक माइक्रो-ऑप्टिमाइज़ेशन की सामान्य श्रेणी में आता है, और इस प्रकार मानक सलाह लागू होती है - परीक्षण का अनुमान नहीं है - मुझे लगता है कि यह आम तौर पर की तुलना में अधिक उपयोगी है __builtin_expect
। शायद ही कोई x86 प्रोसेसर की कोई भी पीढ़ी शाखा भविष्यवाणी संकेत ( संदर्भ ) का उपयोग करती है, इसलिए आप जिस चीज को भी प्रभावित करने में सक्षम होने जा रहे हैं वह विधानसभा कोड का आदेश है। चूँकि आप जानते हैं कि एरर-हैंडलिंग या "एज केस" कोड क्या है, आप इस एनोटेशन का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि कंपाइलर कभी भी इसकी शाखा की भविष्यवाणी नहीं करेगा और आकार के लिए अनुकूलन करने पर इसे "हॉट" कोड से दूर कर देगा।
नमूना उपयोग:
void FooTheBar(void* pFoo)
{
if (pFoo == nullptr)
{
// Oh no! A null pointer is an error, but maybe this is a public-facing
// function, so we have to be prepared for anything. Yet, we don't want
// the error-handling code to fill up the instruction cache, so we will
// force it out-of-line and onto a "cold" path.
[&]() __attribute__((noinline,cold)) {
HandleError(...);
}();
}
// Do normal stuff
⋮
}
इससे भी बेहतर, जीसीसी स्वचालित रूप से उपलब्ध होने पर प्रोफ़ाइल प्रतिक्रिया के पक्ष में इसे अनदेखा कर देगा (उदाहरण के लिए, जब संकलन -fprofile-use
)।
यहां आधिकारिक दस्तावेज देखें: https://gcc.gnu.org/oniltocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes