2010-01-24 31 views
6

मैं std :: वेक्टर कोड देख रहा था और मुझे कुछ मिला जो मुझे काफी नहीं मिला। जब क्षमता < आकार() + 1 को इसे बफर को पुन: आवंटित करने की आवश्यकता होती है ताकि यह नया तत्व सम्मिलित कर सके। यह क्या करता है (जहाँ तक मैं कोड से निकालने में सक्षम किया गया है) है:std :: वेक्टर डालने() reallocation

  • नई बफर आवंटित
  • वर्ष बफर के उपसर्ग कॉपी (0 - प्रविष्टि के सूचकांक)
  • नई बफर में नए तत्व का निर्माण
  • वर्ष बफर के प्रत्यय कॉपी (सूचकांक - अंत) वर्ष बफर में सभी वस्तुओं पर
  • कॉल नाशक
  • पुनःआवंटन वर्ष बफर

उपसर्ग और प्रत्यय प्रतिलिपि जहां तक ​​मैं देख सकता था memmove के साथ किया जाता है। डेटा की शुद्ध बाइनरी प्रति याद नहीं है? यह तत्वों के निर्माता को कॉल नहीं करता है, है ना? मैं क्या सोच रहा था, यह कार्य पुराने बफर में तत्वों पर विनाशक को क्यों बुलाता है यदि स्मृति अभी स्थानांतरित हो जाती है, तो नए बफर में फिर से निर्मित नहीं किया जाता है?

+1

मुझे लगता है कि कोड की आपकी समझ गलत है। अगर आपको लगता है कि memmove का उपयोग किया जा रहा है, तो कृपया एक टुकड़ा पोस्ट करें जो इसे दिखाता है। –

+0

memmove का उपयोग कंपाइलर का एक संभावित अनुकूलन है। लेकिन यह हमारे पास केवल पीओडी प्रकारों के लिए मान्य है। यदि इस प्रकार के एक निर्माता/विनाशक हैं तो उन्हें उपयोग करने की आवश्यकता है। –

उत्तर

5

मैंने MSVC8 vector कार्यान्वयन के माध्यम से देखा - मुझे memmove() नहीं दिखाई दे रहा है। पिछले वेक्टर तत्वों को स्थानांतरित नहीं किया जाता है, उनकी प्रतिलिपि बनाई जाती है और उनकी प्रतिलिपि को उन्हें नए बफर पर प्रतिलिपि बनाने के लिए बुलाया जाता है (बफर को एक ही आवंटन में आवंटित किया जाता है, तत्वों को प्लेसमेंट का उपयोग करके बनाया जाता है)।

बेशक यह केवल एमएसवीसी कार्यान्वयन है, लेकिन यह vector मानक के अनुसार व्यवहार करना चाहिए।

हालांकि, memmove का उपयोग कभी-कभी ठीक होता है - उदाहरण के लिए std::vector<int> - और एसटीएल कार्यान्वयन इस मामले के लिए विशेषज्ञ हैं। हो सकता है कि आपने सोर्स कोड पढ़ने वाले टेम्पलेट 'शाखा' को याद किया हो।

+0

हाँ, मैंने किया। मैं विशेषज्ञता देख रहा था। धन्यवाद! –

+0

मुझे आश्चर्य है कि यह निर्माण और विनाश के बजाय 'स्वैप (पुराना, नया)' के बराबर मान्य होगा। –

+0

मुझे नहीं लगता कि 'स्वैप' मान्य है क्योंकि इसे 'पुराना' और 'नया' पूरी तरह से निर्मित करने की आवश्यकता है, जो गंतव्य बफर के मामले में नहीं है। सी ++ 11 के साथ, 'std :: copy' के बजाय' std :: move' ठीक है, हालांकि। –

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