आपके द्वारा लिखे गए कोड की शुद्धता कभी भी अनुकूलन पर निर्भर नहीं होनी चाहिए । C ++ "वर्चुअल मशीन" पर निष्पादित होने पर इसे सही परिणाम का उत्पादन करना चाहिए जो वे विनिर्देश में उपयोग करते हैं।
हालाँकि, आप जिस बारे में बात करते हैं वह दक्षता दक्षता प्रश्न से अधिक है। यदि आपका RVO ऑप्टिमाइज़र कंपाइलर के साथ अनुकूलित है तो आपका कोड बेहतर चलता है। यह ठीक है, अन्य उत्तरों में इंगित सभी कारणों से।
हालाँकि, यदि आपको इस अनुकूलन की आवश्यकता होती है (जैसे कि यदि कॉपी कंस्ट्रक्टर वास्तव में आपके कोड को विफल करने का कारण होगा), तो अब आप कंपाइलर के चक्कर में हैं।
मुझे लगता है कि मेरे अपने अभ्यास में इसका सबसे अच्छा उदाहरण टेल कॉल ऑप्टिमाइज़ेशन है:
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
यह एक मूर्खतापूर्ण उदाहरण है, लेकिन यह एक पूंछ कॉल को दर्शाता है, जहां एक फ़ंक्शन के अंत में एक फ़ंक्शन को पुनरावर्ती रूप से सही कहा जाता है। C ++ वर्चुअल मशीन दिखाएगा कि यह कोड ठीक से काम करता है, हालांकि मुझे इस बात का थोड़ा भ्रम हो सकता है कि मैंने पहली बार में इस तरह की अतिरिक्त दिनचर्या लिखने को क्यों परेशान किया। हालांकि, C ++ के व्यावहारिक कार्यान्वयन में, हमारे पास एक स्टैक है, और इसमें सीमित स्थान है। यदि पांडित्यपूर्ण रूप से किया जाता है, तो इस फ़ंक्शन को b + 1
स्टैक पर कम से कम स्टैक फ़्रेम को धक्का देना होगा क्योंकि यह इसके अतिरिक्त करता है। अगर मैं गणना करना चाहता हूं sillyAdd(5, 7)
, तो यह कोई बड़ी बात नहीं है। अगर मैं गणना करना चाहता हूं sillyAdd(0, 1000000000)
, तो मैं स्टैकऑवरफ्लो (और अच्छी तरह नहीं ) पैदा करने की वास्तविक समस्या में हो सकता हूं ।
हालाँकि, हम देख सकते हैं कि एक बार जब हम उस अंतिम रिटर्न लाइन पर पहुँच जाते हैं, तो हम वास्तव में वर्तमान स्टैक फ्रेम में सब कुछ के साथ कर रहे हैं। हमें वास्तव में इसे आसपास रखने की आवश्यकता नहीं है। टेल कॉल ऑप्टिमाइज़ेशन आपको अगले फ़ंक्शन के लिए मौजूदा स्टैक फ़्रेम को "पुन: उपयोग" करने देता है। इस तरह, हमें केवल 1 स्टैक फ्रेम की आवश्यकता है, बजाय b+1
। (हमें अभी भी उन सभी मूर्खतापूर्ण परिवर्धन और घटाव को करना है, लेकिन वे अधिक स्थान नहीं लेते हैं।) वास्तव में, अनुकूलन कोड को इसमें बदल देता है:
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
कुछ भाषाओं में, विनिर्देश द्वारा पूंछ कॉल अनुकूलन स्पष्ट रूप से आवश्यक है। C ++ उनमें से एक नहीं है । जब तक मैं केस-बाय-केस नहीं जाता, मैं इस टेल कॉल ऑप्टिमाइज़ेशन अवसर को पहचानने के लिए C ++ कंपाइलर्स पर भरोसा नहीं कर सकता। विज़ुअल स्टूडियो के मेरे संस्करण के साथ, रिलीज़ संस्करण टेल कॉल ऑप्टिमाइज़ेशन करता है, लेकिन डिबग संस्करण (डिज़ाइन द्वारा) नहीं होता है।
इस प्रकार यह मेरे लिए बुरा होगा कि मैं गणना करने में सक्षम होने पर निर्भर रहूं sillyAdd(0, 1000000000)
।