खोज…
परिचय
संकलन करते समय, कंपाइलर अक्सर प्रदर्शन को बढ़ाने के लिए कार्यक्रम को संशोधित करेगा। यह अनुमति दी जाती है, जैसा कि नियम है , जो किसी भी और सभी परिवर्तनों को अनुमति देता है जो अवलोकन योग्य व्यवहार को नहीं बदलते हैं।
इनलाइन विस्तार / इनलाइनिंग
इनलाइन विस्तार (जिसे इनलाइनिंग के रूप में भी जाना जाता है) कंपाइलर ऑप्टिमाइज़ेशन है जो किसी फ़ंक्शन को उस फ़ंक्शन के शरीर के साथ कॉल की जगह देता है। यह फ़ंक्शन कॉल ओवरहेड को बचाता है, लेकिन अंतरिक्ष की कीमत पर, क्योंकि फ़ंक्शन को कई बार दोहराया जा सकता है।
// source:
int process(int value)
{
return 2 * value;
}
int foo(int a)
{
return process(a);
}
// program, after inlining:
int foo(int a)
{
return 2 * a; // the body of process() is copied into foo()
}
इनलाइनिंग आमतौर पर छोटे कार्यों के लिए किया जाता है, जहां फ़ंक्शन बॉडी के आकार की तुलना में फ़ंक्शन कॉल ओवरहेड महत्वपूर्ण है।
खाली आधार अनुकूलन
किसी भी वस्तु या सदस्य उप-विषय का आकार कम से कम 1 होना आवश्यक है, भले ही वह प्रकार एक खाली class
प्रकार हो (अर्थात, एक class
या struct
जिसमें कोई गैर-स्थैतिक डेटा सदस्य नहीं है), इस बात की गारंटी देने में सक्षम होने के लिए एक ही प्रकार की अलग-अलग वस्तुओं के पते हमेशा अलग होते हैं।
हालांकि, बेस class
सबोबेक्ट्स इतने विवश नहीं हैं, और ऑब्जेक्ट लेआउट से पूरी तरह से अनुकूलित किए जा सकते हैं:
#include <cassert>
struct Base {}; // empty class
struct Derived1 : Base {
int i;
};
int main() {
// the size of any object of empty class type is at least 1
assert(sizeof(Base) == 1);
// empty base optimization applies
assert(sizeof(Derived1) == sizeof(int));
}
खाली बेस अनुकूलन का उपयोग आमतौर पर आवंटनकर्ता-जागरूक मानक लाइब्रेरी क्लासेस ( std::vector
, std::function
, std::shared_ptr
, आदि) द्वारा किया जाता है, यदि एलोकेटर स्टेटलेस है, तो उसके आवंटनकर्ता सदस्य के लिए किसी भी अतिरिक्त संग्रहण पर कब्जा करने से बचें। यह आवश्यक डेटा सदस्यों में से एक (जैसे, begin
, end
, या vector
लिए capacity
सूचक) को संग्रहीत करके प्राप्त किया जाता है।
संदर्भ: cppreference