2017-06-01 18 views
6

तो मैं समझता हूं कि s2s1 + s1 अभिव्यक्ति से जुड़ा हुआ है, लेकिन क्या यह मूल्यांकन s2 पर दिया गया है या यह आलसी है और मूल्यांकन किया जाता है जब s2 += "Test"; कहा जाता है? और s2 अस्थायी स्ट्रिंग के लिए स्मृति भी रखेगा?एक रैल्यू मूल्यांकन कब किया जाता है?

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s1 = "Test"; 
    std::string&& s2 = s1 + s1; 
    s2 += "Test"; 
    std::cout << s2 << '\n'; 
} 

उत्तर

16

s2 अभिव्यक्ति s1 + s1 को बांधता है, लेकिन इस बार s2 पर मूल्यांकन किया जाता

हाँ निर्दिष्ट किया जाए।

और s2 अस्थायी स्ट्रिंग के लिए स्मृति पकड़ लेंगे?

सटीक, s2 अस्थायी std::string से जुड़ा हुआ है।

s1 + s1 एक अस्थायी std::string का उत्पादन करेगा, जो संदर्भ s2 (और इसका जीवनकाल संदर्भ के जीवनकाल तक बढ़ाया जाएगा) के लिए बाध्य होगा। फिर s2 += "Test";, पर s2 पर प्रदर्शन करता है, यानी अस्थायी std::string

+0

त्वरित उत्तर के लिए धन्यवाद। ऐसा लगता है कि यदि 's2' सिर्फ एक और' std :: string' था, तो परिणाम समान होंगे, लेकिन परिणामी द्विआधारी अलग-अलग होंगी? –

+0

@ ब्रैडीडीन हां परिणाम वही है। परिणाम द्विआधारी के बारे में कहना मुश्किल है; वैसे भी मैंने कोशिश की [यहां] (https://gcc.godbolt.org/) और यह वही असेंबली देता है। – songyuanyao

+0

ध्यान दें कि यह C++ 17 में इस तरह से परिवर्तन करता है जो इस मामले में शून्य अवलोकन करने योग्य अंतर बनाता है। – Yakk

2

अभिव्यक्तियों का मूल्यांकन हमेशा उस बिंदु पर किया जाता है जब कार्यक्रम उन्हें पहुंचता है। अभिव्यक्ति का परिणाम हमेशा एक मान (या शून्य) होता है।

मानों में एक प्रकार है, और अभिव्यक्तियों की एक मूल्य श्रेणी होती है, जो कि किसी भी विशेष उपयोग पर ओवरलोड लोड का अधिक भार लोड करने के लिए संयोजन होता है।

आपके मामले में, string operator+(...) श्रेणी पीआर-वैल्यू (जो कि एक प्रकार का रावल्यू है) के साथ स्ट्रिंग मान में परिणाम देता है। इसके बाद यह तुरंत स्ट्रिंग से जुड़ा हुआ है, इसलिए इसका जीवनकाल संदर्भ के लिए बढ़ाया गया है।

यदि आपने इसे सादे स्ट्रिंग में असाइन किया था, तो string& string::operator=(string&&) उस ऑपरेटर के किसी अन्य ओवरलोड पर चुना गया होगा। ध्यान दें कि चूंकि सी ++ 11 संकलक की अनुमति है (और सी ++ 17 से आवश्यक) लक्ष्य वस्तु के अंदर सीधे मूल्य को मूर्त रूप देने के लिए। इस प्रक्रिया को कॉपी/मूव एलिशन या (एन) आरवीओ के रूप में जाना जाता है, नामित (नामांकित) रिटर्न वैल्यू ऑप्टिमाइज़ेशन।

+0

@Yakk विशेष रूप से कौन सी चीजें हैं? मेरे ज्ञान के लिए एकमात्र परिवर्तन यह है कि चाल निर्माण elided है, और यह स्ट्रिंग – Caleth

+1

के लिए C++ 14 के लिए बिल्कुल अलग नहीं है क्षमा करें, मैंने शपथ ली कि मैंने "ऑब्जेक्ट" शब्द देखा जहां यह नहीं होना चाहिए था, लेकिन मुझे अब यह नहीं दिख रहा है, इसलिए मुझे गलत होना चाहिए था। – Yakk

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