मैं इसकी चिंता नहीं करूंगा। यदि आप इसे लूप में करते हैं, तो स्ट्रिंग्स हमेशा वास्तविकताओं को कम करने के लिए मेमोरी का प्रचार करेंगे - बस operator+=
उस स्थिति में उपयोग करें । और अगर आप इसे मैन्युअल रूप से करते हैं, तो कुछ ऐसा या लंबा
a + " : " + c
फिर यह अस्थायीता पैदा कर रहा है - भले ही कंपाइलर कुछ रिटर्न वैल्यू प्रतियां समाप्त कर सकता है। ऐसा इसलिए है क्योंकि क्रमिक रूप से कहा जाता है, operator+
यह नहीं जानता कि संदर्भ पैरामीटर एक नामित वस्तु का संदर्भ देता है या एक उप operator+
आहरण से लौटा अस्थायी । मैं इसके बारे में चिंता नहीं करना चाहूंगा कि पहले इसे प्रोफाईल न किया जाए। लेकिन ऐसा दिखाने के लिए एक उदाहरण लेते हैं। बंधन को स्पष्ट करने के लिए हम पहले कोष्ठक का परिचय देते हैं। स्पष्टता के लिए उपयोग किए जाने वाले फ़ंक्शन घोषणा के बाद मैंने सीधे तर्क दिए। उसके बाद, मैं दिखाता हूं कि परिणामी अभिव्यक्ति क्या है:
((a + " : ") + c)
calls string operator+(string const&, char const*)(a, " : ")
=> (tmp1 + c)
अब, इसके अलावा, tmp1
ऑपरेटर को पहले कॉल के द्वारा दिखाए गए तर्कों के साथ वापस लौटा दिया गया है। हम मानते हैं कि कंपाइलर वास्तव में चतुर है और रिटर्न वैल्यू कॉपी का अनुकूलन करता है। तो हम एक नया स्ट्रिंग है के संयोजन में शामिल है के साथ खत्म हो a
और " : "
। अब, यह होता है:
(tmp1 + c)
calls string operator+(string const&, string const&)(tmp1, c)
=> tmp2 == <end result>
निम्नलिखित की तुलना करें:
std::string f = "hello";
(f + c)
calls string operator+(string const&, string const&)(f, c)
=> tmp1 == <end result>
यह अस्थायी और नामित स्ट्रिंग के लिए समान फ़ंक्शन का उपयोग कर रहा है! तो संकलक को तर्क को एक नए स्ट्रिंग में कॉपी करना होगा और उस पर संलग्न करना होगा और इसे शरीर से वापस करना होगा operator+
। यह एक अस्थायी की स्मृति नहीं ले सकता है और उसी को जोड़ सकता है। अभिव्यक्ति जितनी बड़ी होती है, उतने ही तार की प्रतियाँ करनी पड़ती हैं।
अगला विज़ुअल स्टूडियो और GCC c ++ 1x के मूवमेंट शब्दार्थ ( कॉपी सिमेंटिक्स का पूरक ) और प्रायोगिक जोड़ के रूप में संदर्भों का समर्थन करेगा । यह पता लगाने की अनुमति देता है कि पैरामीटर अस्थायी है या नहीं। यह इस तरह के परिवर्धन को आश्चर्यजनक रूप से तेज कर देगा, क्योंकि उपरोक्त सभी प्रतियां के बिना एक "ऐड-पाइपलाइन" में समाप्त हो जाएंगे।
यदि यह एक अड़चन है, तो आप अभी भी कर सकते हैं
std::string(a).append(" : ").append(c) ...
append
कॉल करने के लिए तर्क संलग्न *this
और फिर खुद के लिए एक संदर्भ लौट आते हैं। इसलिए वहां अस्थायी लोगों की कोई नकल नहीं की जाती है। या वैकल्पिक रूप से, का operator+=
उपयोग किया जा सकता है, लेकिन पूर्ववर्तीता को ठीक करने के लिए आपको बदसूरत कोष्ठक की आवश्यकता होगी।