यदि आपके पास एक संकलक है जो रैवल्यू संदर्भों का समर्थन करता है, तो इसे वेक्टर में स्थानांतरित किया जाएगा, जो कभी-कभी काफी सस्ता होता है।
इसका एक विकल्प सीधे वेक्टर में ऑब्जेक्ट का निर्माण करना है, जिसे vec.emplace_back("abc");
के साथ किया जा सकता है। यह केवल एक कन्स्ट्रक्टर का आह्वान करता है।
इनमें से दोनों सी ++ 11 विशेषताएं हैं। कॉपी एलिजन की अनुमति नहीं है, इसलिए उन सुविधाओं के बिना कॉपी अभी भी बनाई जाएगी।
हालांकि, अगर कॉपी कन्स्ट्रक्टर के पास कोई अवलोकन दुष्प्रभाव नहीं है (जो इसे वैसे भी नहीं होना चाहिए), तो एक स्मार्ट कंपाइलर अभी भी उस अनुकूलन को निष्पादित कर सकता है, क्योंकि "as-if" नियम किसी भी अनुकूलन की अनुमति देता है जिसके परिणामस्वरूप एक ही देखने योग्य व्यवहार। मुझे नहीं पता कि कोई मौजूदा कंपाइलर ऐसा करता है, हालांकि। यदि नहीं, तो मुझे संदेह है कि कोई भी इस तरह के अनुकूलन को जोड़ने का प्रयास करेगा क्योंकि रावल संदर्भों ने उस आवश्यकता को समाप्त कर दिया है।
स्रोत
2012-08-09 02:31:09
मुझे ऐसा नहीं लगता क्योंकि 'वेक्टर' (वास्तव में एसटीएल आवंटक) नियुक्ति 'नया' का उपयोग करता है। –
@ सेठ कार्नेगी - यह प्लेसमेंट 'नया' से कैसे संबंधित है? मान लें कि आपके पास वेक्टर में पर्याप्त खाली स्थान है, फिर एक कंपाइलर केवल 'ए' जगह का एक उदाहरण बना सकता है। –
@Nya क्योंकि संकलक शायद यह नहीं समझ पाएगा कि यह कहां बनाया जाएगा (ऐसा नहीं है कि यह नहीं हो सकता है, लेकिन ऐसा नहीं होगा, क्योंकि संकलक लेखकों ने उस अनुकूलन को नहीं लिखा था)। –