2011-06-26 9 views
10

कोई भी कूदता है और कहता है Profile before optimize!, यह केवल एक जिज्ञासा प्रश्न है और this original question से उपजी है।क्या सी ++ कंपाइलर अप्रयुक्त रिटर्न वैल्यू को 'संदर्भ` से ऑप्टिमाइज़ करेगा?

यदि मैं एक ही वस्तु के संदर्भ में लौट रहा हूं, तो क्या इसका उपयोग नहीं किया जाता है? उदाहरण के लिए, मेरे पास Vector<> है जिसमें विभिन्न गणितीय फ़ंक्शन हैं (मान लें कि मैं ऑपरेटर ओवरलोडिंग का उपयोग नहीं कर रहा हूं)। इसे लिखने के दो तरीके हैं:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector 

या

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector 

अब अगर Add() वापसी मान के उपयोग के बिना प्रयोग किया जाता है, संकलक बस दूर वापसी पूरी तरह फेंक होगा और जैसे कि यह कोई है समारोह हो जाता है शुरू करने के लिए वापसी मूल्य? और क्या होगा यदि यह inlined नहीं है?

उत्तर

11

तर्क या वापसी विवरण के रूप में संदर्भ आमतौर पर पॉइंटर्स के समान तरीके से कार्यान्वित किए जाते हैं और लागत न्यूनतम है (ज्यादातर मामलों में नगण्य)। कॉलिंग सम्मेलन के आधार पर यह एक रजिस्टर में एक ही स्टोर हो सकता है।

क्या रिटर्न को अनुकूलित किया जा सकता है, जब तक संकलक कोड संख्या को रेखांकित नहीं कर रहा है, यह नहीं कर सकता है। जब संकलक फ़ंक्शन को संसाधित करता है, तो यह नहीं पता कि कॉलिंग कोड का उपयोग कथन कथन का होगा या नहीं, और बदले में इसका मतलब है कि इसे हमेशा वापस करना होगा।

+0

+1, अभी तक एक और अच्छा जवाब हमेशा के रूप में :) –

+2

यह मानता है कि संकलक प्रत्येक बार इसे संसाधित करने के बजाए फ़ंक्शन को संसाधित करेगा। कई आधुनिक कंपाइलर्स बाद में (या करने के लिए कॉन्फ़िगर किया जा सकता है) करते हैं। ऐसा करने के कारणों में से एक यह है कि इस तरह के अनुकूलन को ठीक से अनुमति दें। –

+0

"जब तक संकलक कोड नंबर को रेखांकित नहीं कर रहा है" - अर्थात् 'आजकल, एलटीओ के साथ, सभी गैर-साझा-ऑब्जेक्ट कोड को रेखांकित किया जा सकता है, तो शायद हां' :-) –

4

यदि फ़ंक्शन को रेखांकित नहीं किया गया है, तो हाँ वापसी मूल्य कहीं भी संग्रहीत किया जाना चाहिए, शायद एक सीपीयू रजिस्टर। यह शायद एक एकल रजिस्टर प्रति की आवश्यकता है। मुझे आश्चर्य होगा कि ज्यादातर मामलों में ओवरहेड एक सीपीयू चक्र से अधिक था।