यदि आप मूल्य प्रकारों के साथ C++ std :: map (और अन्य कंटेनर) का उपयोग करते हैं, तो आप देखेंगे कि मानचित्र में डालने से आपके तत्व प्रकार के लिए विनाशक को कॉल किया जाता है।क्यों सी ++ std :: map :: ऑपरेटर [] जगह जगह का उपयोग नहीं करता है?
(*((std::map<>::insert(std::make_pair(x, T()))).first)).second
यह आदेश है कि जोड़ी बनाने के लिए आपके प्रकार के डिफ़ॉल्ट निर्माता कहता है: यह इसलिए है क्योंकि ऑपरेटर के कार्यान्वयन [] सी ++ कल्पना के लिए आवश्यक है इस के लिए बराबर हो रहा है। उस अस्थायी मूल्य को मानचित्र में कॉपी किया जाता है, और फिर नष्ट कर दिया जाता है। इसकी पुष्टि this stackoverflow post और here on codeguru में पाई जा सकती है।
मुझे जो अजीब लगता है वह यह है कि इसे अस्थायी चर की आवश्यकता के बिना लागू किया जा सकता है और फिर भी समकक्ष हो सकता है। सी ++ की एक विशेषता है जिसे "inplace new" कहा जाता है। Std :: map और अन्य कंटेनर ऑब्जेक्ट के लिए खाली स्थान आवंटित कर सकते हैं और फिर आवंटित स्थान पर तत्व के डिफ़ॉल्ट कन्स्ट्रक्टर को स्पष्ट रूप से कॉल कर सकते हैं।
मेरा प्रश्न: मैं इस ऑपरेशन को अनुकूलित करने के लिए नए स्थान का उपयोग करने वाले std :: मानचित्र के कार्यान्वयन में से कोई भी क्यों नहीं उपयोग करता हूं? ऐसा लगता है कि यह इस निम्न स्तरीय संचालन के प्रदर्शन में काफी सुधार करेगा। लेकिन कई आंखों ने एसटीएल कोड बेस का अध्ययन किया है, इसलिए मुझे लगता है कि ऐसा कुछ कारण होना चाहिए।
टेस्ट केस लिंक किए गए स्टैक ओवरफ्लो पोस्ट में शामिल है। यहां लिंक फिर से दिया गया है: https://stackoverflow.com/questions/4017892/in-an-stl-map-of-structs-why-does-the-operator-cause-the-structs-dtor-to – srm
माइक सेमुर: तो आप सुझाव दे रहे हैं कि डीबगर बंद होने के साथ, विनाशक को ये अतिरिक्त कॉल दूर चले जाएंगे? क्या आप जानते हैं कि यह सच है? भले ही यह सच है, इसका मतलब यह है कि डीबगिंग के साथ, निष्पादन को डीबग करना कठिन होता है (मैं अपने डीबगर में "वास्तविक" स्कोप मुद्दों की तलाश में केवल ब्रेकपॉइंट सेट नहीं कर सकता)। यह डिबगिंग के दौरान भी कम प्रदर्शनकारी है, जो एक कम मुद्दा है, लेकिन फिर भी वास्तविक है। इन दोनों कारणों से मुझे निम्न स्तर की लाइब्रेरी के बजाय नए स्थान का उपयोग करने के कारण होने लगते हैं। – srm