2017-04-05 21 views
9

पर प्रतियां मैं जोड़ने rvalues ​​साथ :: एसटीडी पर वेक्टर कुछ अजीब व्यवहार करता है , जितना अधिक मैं करता हूं - मुझे जितनी अधिक प्रतियां मिलती हैं। हालांकि, यदि मैं डिफ़ॉल्ट एक ए (ए & & डेटा) = डिफ़ॉल्ट के साथ चालक को प्रतिस्थापित करता हूं; या ए (कॉन्स ए & डेटा) के साथ कॉपी कन्स्ट्रक्टर को हटाएं = हटाएं; मुझे सही परिणाम मिलता है जहां कोई प्रतियां नहीं बनाई जाती हैं। अगर मैं पहले पर्याप्त आकार के साथ datavec.reserve को कॉल करता हूं तो मेरे पास कोई प्रतियां नहीं होती हैं। मैं कोई विशेष तर्कС ++ 11 वेक्टर rvalue

g++ -std=c++11 -o main ../main.cpp 

तुम क्यों वेक्टर स्पष्ट rvalues ​​की प्रतियां बनाता है पर कोई विचार मिल गया है के साथ जीसीसी संस्करण 5.4.0 का उपयोग करें? मुझे उम्मीद है कि यह एसटीएल

+1

महान प्रश्न, महान उत्तर, और महान डुप्लिकेट स्पॉट। – Bathsheba

उत्तर

12

std::vectorआंतरिक बफर रीयलोकेशन के दौरान आपके तत्वों की प्रतिलिपि बना रहा है। यह आगे बढ़ने की बजाय कॉपी करने का चयन कर रहा है क्योंकि आपके चालक कन्स्ट्रक्टर को noexcept चिह्नित नहीं किया गया है। इसे चिह्नित कर रहा है ...

A(A &&) noexcept {  std::cout << "moved " << std::endl; } 

... समस्या को ठीक करेगा।

संकलक है कि आपके चाल निर्माता फेंक नहीं होगा std::vector के कार्यान्वयन आंतरिक पुनः आबंटन के दौरान स्थानांतरित करने के लिए, अपवाद की गारंटी देता है सी ++ स्टैंडर्ड की मांग को पूरा करने की अनुमति देता है बताना।

वैकल्पिक रूप से, आप आंतरिक बफर के विकास को रोकने के लिए पहले से ही अपने कंटेनर std::vector::reserve कर सकते हैं।

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