वस्तुओं की घोषणा का प्रदर्शन

Jan 03 2021

मैं किसी तरह के विश्वविद्यालय विजय पर कोडिंग कर रहा था और कुछ देखा, जब मैंने नीचे दिए गए लूप में एक मानचित्र घोषित किया:

for (int i = 0; i < n; i++)
{
    map<int, bool> hashMap;
    //...
}

इससे अधिक समय लगता है:

map<int, bool> hashMap;
for (int i = 0; i < n; i++)
{
    hashMap.clear();
    //...
}

इसलिए मैं सोच रहा था कि लूप में किसी ऑब्जेक्ट को घोषित करने से उसका प्रदर्शन फिर से शुरू करने की तुलना में खराब प्रदर्शन क्यों होता है?

जवाब

2 dxiv Jan 04 2021 at 10:59

कोड के पहले संस्करण में कंस्ट्रक्टर और डिस्ट्रक्टर hashMapहैं जिन्हें nबार कहा जाता है, जबकि दूसरे संस्करण में उन्हें सिर्फ एक बार कहा जाता है।

स्वाभाविक प्रश्न यह है कि किसी नई mapवस्तु को नष्ट करना और निर्माण करना एक ही वस्तु को अलग-अलग बनाम समाशोधन और पुन: उपयोग करना बिल्कुल अलग होगा। यह निश्चित रूप mapसे उपयोग किए जा रहे कार्यान्वयन के वास्तविक कोड का निरीक्षण करके ही उत्तर दिया जा सकता है, इसलिए निम्नलिखित केवल एक प्रशंसनीय अनुमान है।

std::mapआमतौर पर लाल-काले पेड़ों का उपयोग करके लागू किया जाता है , और यह लाल-काले पेड़ के कार्यान्वयन के लिए आम है, जो कि NIL- पत्तियों के लिए एक प्रहरी नोड का उपयोग करता है , उदाहरण के लिए एक लाल काले पेड़ में एक संतरी नोड का लाभ देखें ? । इस प्रहरी को हर बार एक पेड़ के निर्माण के लिए आवंटित किया जाना चाहिए, फिर विनाश पर जारी किया गया। इसके विपरीत, clear'आईएनजी map, इसके बजाय, पेड़ को खाली करता है लेकिन संबंधित आंतरिक वस्तुओं का पुन: उपयोग करता है।

इस तरह के कार्यान्वयन के वास्तविक जीवन के उदाहरण के लिए, माइक्रोसॉफ्ट के _Treeनिर्माता ने उपयुक्त नाम दिया _Alloc_sentinel_and_proxy();। चूंकि उनके mapव्युत्पन्न होते हैं _Tree, इसलिए इसे हर बार एक mapऑब्जेक्ट का निर्माण कहा जाता है।