2010-09-27 8 views
13

सी # में अगर मैं निम्नलिखित कोडशून्य सूचक का कितना मेमोरी उपयोग करता है?

Dictionary<int,object> dictionary = new Dictionary<int, object>(); 
dictionary.Add(1,null); 
dictionary.Add(2,new object()); 
dictionary[2] = null; 

कितना स्मृति आवंटित किया जा रहा है का उपयोग करें? शब्दकोश में प्रत्येक ऑब्जेक्ट संदर्भ (शब्दकोश [1], शब्दकोश [2]) ढेर पर एक सूचक आकार (32 या 64 बिट) लेता है? दूसरे शब्दों में जब मैं शब्दकोश करता हूं। जोड़ें (1, शून्य) क्या सीएलआर स्वचालित रूप से ढेर पर 2 आवंटन बनाता है, एक int के लिए और एक शून्य सूचक के लिए?

उत्तर

0

मैं हाँ लगता है, क्योंकि अशक्त एक संदर्भ है। यह कहीं भी इंगित नहीं करता है, लेकिन आप इसे वास्तविक ऑब्जेक्ट संदर्भ के साथ हर बार बदल सकते हैं।

तो मुझे लगता है कि कम से कम 2x64bit आवंटित किए गए हैं, शायद शब्दकोश को अपने लिए अतिरिक्त स्थान की आवश्यकता है।

+0

मैं आपके उत्तर से सहमत हूं, लेकिन मेरे पास इसके बारे में एक सवाल है। पॉइंटर्स int32 या int64 चर हैं, इसलिए, यदि आप उन्हें शून्य सेट करते हैं, तो हमारे पास स्मृति में कोई अन्य ऑब्जेक्ट नहीं है लेकिन अभी भी int32 ऑब्जेक्ट्स पॉइंटर चर के रूप में हैं? –

+0

@ डॉ टीजे: पॉइंटर्स वास्तव में int32 या int64 ऑब्जेक्ट्स नहीं हैं, लेकिन उनके पास एक ही आकार है। सी एफ डबल में int64 के समान आकार होता है, लेकिन यह एक अलग प्रकार है। शून्य सूचक को 32 या 64 शून्य बिट्स द्वारा दर्शाया जाता है, और उन बिट्स को स्पष्ट रूप से कहीं भी संग्रहीत किया जाना चाहिए। – MSalters

+0

ठीक है, स्पष्टीकरण के लिए धन्यवाद ... –

15

शून्य पॉइंटर ढेर पर कुछ भी स्टोर करने के लिए कोई अतिरिक्त मेमोरी आवंटित नहीं करता है (क्योंकि स्टोर करने के लिए कुछ भी नहीं है)। हालांकि, आपके शब्दकोश को नल पॉइंटर को ही स्टोर करना है, जो कि किसी भी अन्य सूचक के रूप में उतना ही स्थान लेता है।

चाहे नए आवंटन (सूचक को स्टोर करने के लिए) में प्रत्येक ऐड कॉल परिणाम हों या नहीं, शब्दकोश कार्यान्वयन पर निर्भर करता है। आमतौर पर, इसमें एक आंतरिक सरणी होती है जो आवश्यकतानुसार पुनः आकार में हो जाती है।

आपके उदाहरण में, मुझे लगता है कि कुछ तत्वों के लिए पर्याप्त स्थान पहले ही आवंटित किया जाता है जब आप शब्दकोश बनाते हैं। तो जोड़ें (1, शून्य) कोई और जगह आवंटित नहीं करेगा।

अद्यतन: default initial capacity for Dictionary निर्दिष्ट नहीं है। .NET 4.0 में, यह 0 से शुरू होता है, वास्तव में, इसलिए पहला ऐड स्टोरेज सरणी बना देगा।

+0

महान उत्तर धन्यवाद! मैं लिंक्ड सूचियों को सीख रहा हूं - सिस्टम इस तथ्य को कैसे संभालता है कि एक लिंक की गई सूची शून्य पॉइंटर्स की अनंत राशि बनाती है? वे सभी का उपयोग नहीं किया जाता है, जाहिर है, लेकिन डेटा और नोड पॉइंटर के साथ नोड संरचना का निर्माण लगातार पॉइंटर नोड बनाता है। यह स्मृति में कैसे संभाला जाता है? प्रत्येक शून्य सूचक में एक स्मृति पता है? क्या कंप्यूटर गतिशील रूप से आवश्यक स्मृति को आवंटित करते हैं? – Federico

1

अपने आप में एक शून्य सूचक 4 या 8 बाइट्स लेगा, इस पर निर्भर करता है कि यह 32-बिट या 64-बिट के रूप में चल रहा है, जैसा कि आपने अनुमान लगाया है।

किसी दिए गए संग्रह में इससे अधिक नहीं हो सकता है। Dictionary<TKey, TValue> के कार्यान्वयन दोनों Entry<TKey, TValue> संरचनाओं, जो दो int रों रूप में अच्छी तरह कुंजी और मान, और भी रूप में है कि सरणी में अनुक्रमण में इस्तेमाल पूर्णांकों की एक सरणी में शामिल है की एक सरणी का उपयोग करता है। इसलिए भले ही कोई "से बढ़ कमरा" था (और वहाँ आम तौर पर है) प्रत्येक प्रविष्टि 20bytes या स्मृति के 24bytes की आवश्यकता होगी (बजाय सिर्फ 8 या 12 कुंजी और मान के आकार से अपरिहार्य) के लिए भूमि के ऊपर के शीर्ष पर, शब्दकोश स्वयं (प्रत्येक सरणी के ऊपरी भाग सहित)।

अन्य कार्यान्वयन और अन्य संग्रह अन्य ओवरहेड्स होगा। वे एक शून्य प्रविष्टि के लिए null स्टोर भी नहीं कर सकते हैं। null यह इंगित करने का एक उपयोगी तरीका हो सकता है कि एक मान लिखा नहीं गया है, जिस स्थिति में एक विशेष मूल्य null (विशेष रूप से लॉक-फ्री डिक्शनरी कार्यान्वयन में उपयोगी होता है), जहां यह केवल एक अनसेट के बीच अंतर करने के लिए उपयोगी हो सकता है और सेट मान, लेकिन एक सेट, सेट, और आंशिक रूप से सेट मान के बीच)।

आप वास्तव में कह सकते हैं कि null ए का मूल्य जोड़ना सेटिंग ए) कुछ मेमोरी लेता है और बी) स्मृति को नहीं लेता है कि ऑब्जेक्ट द्वारा गैर-शून्य मूल्य के साथ लिया जाएगा। यहां तक ​​कि बी) वास्तव में नहीं पकड़ता है, क्योंकि यदि उस ऑब्जेक्ट को कहीं और भी संग्रहीत किया गया था, तो संदर्भ के बाहर कहीं और संदर्भ में कोई अतिरिक्त मेमोरी लागत नहीं है, जो इसकी वास्तविक लागत को null संग्रहीत करने के समान बनाता है।

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