2015-01-08 9 views
8

मैं हाल ही में नई सी ++ 11 विशेषताओं को सीख रहा हूं। हालांकि, मैं राजस्व के बारे में एक बात पूरी तरह से समझ नहीं पा रहा हूं।सी ++ में संग्रहीत रैल्यू कहां हैं?

कोड निम्नलिखित पर विचार करें:

string getText() 
{ 
    return "Fabricati diem"; 
} 

string newText = getText(); 

कॉल getText() के लिए एक आर-मूल्य जो newText चर को कॉपी किया है बनाता है। लेकिन यह रैल्यू कहाँ संग्रहित है? और प्रतिलिपि के बाद इसका क्या होता है?

+1

वास्तव में यह [वापसी मूल्य अनुकूलन] (http://en.wikipedia.org/wiki/Return_value_optimization) के कारण कॉपी नहीं किया गया है – CoryKramer

+7

@ साइबर इसे स्थानांतरित नहीं किया जा सकता * और * RVO'd। यह एक या दूसरा है, जो बाद में सबसे अधिक संभावना है। – juanchopanza

+0

अच्छी पकड़, आप सही हैं। मैंने अपनी टिप्पणी संपादित की। – CoryKramer

उत्तर

8

getText() को कॉल करें एक आर-वैल्यू बनाता है जिसे न्यूटेक्स्ट वैरिएबल में कॉपी किया गया है।

यह एक अस्थायी बना सकता है; लेकिन यह एक ऐसी स्थिति है जिसमें copy elision की अनुमति है, इसलिए यह अधिक संभावना है कि newText सीधे फ़ंक्शन रिटर्न द्वारा प्रारंभ किया गया है, बिना अस्थायी।

लेकिन यह रावल्यू कहां से संग्रहीत है?

यह एक अस्थायी स्टोर करने के लिए कंपाइलर पर निर्भर करता है; मानक केवल अपने जीवनकाल को निर्दिष्ट करता है। आम तौर पर, इसे एक स्वचालित चर की तरह माना जाएगा, जो रजिस्टरों में संग्रहीत होता है या फ़ंक्शन के स्टैक फ्रेम में।

और प्रतिलिपि के बाद इसका क्या होता है?

एक अस्थायी के जीवनकाल पूर्ण अभिव्यक्ति है जो इसे बनाया (जब तक यह एक referenece, जिस स्थिति में यह रूप में लंबे समय तक रहता है कि संदर्भ के रूप में आरंभ करने के लिए प्रयोग किया जाता है) के अंत तक फैली हुई है। तो यहां, newText आरंभ करने के लिए इसका उपयोग करने के तुरंत बाद इसे नष्ट कर दिया गया है।

संबंधित मुद्दे