2011-12-11 9 views
6

सूची <long> बनाम लंबे [], स्मृति उपयोग

List<long> ListOfLongs; 
long[] ArrayOfLongs; 

तो प्रत्येक एन तत्व है, स्मृति वे कितना खा के लिए स्मृति में आकार के बारे में?

मैं यह पूछ रहा हूं क्योंकि मेरे ज्ञान के अनुसार, .NET में टेम्पलेट (जेनेरिक) विशेषज्ञता नहीं है।

उत्तर

10

व्यावहारिक रूप से स्मृति की एक ही मात्रा (तकनीकी रूप से, List शायद कुछ और उपभोग करेगी क्योंकि यह अधिक आवंटित है ताकि यह अधिक आसानी से बढ़ सके)।

.NET में जेनेरिक संग्रहों को उनके द्वारा रखी गई वस्तुओं को बॉक्स करने की आवश्यकता नहीं है, जो एक विशाल स्मृति और प्रदर्शन सिंक होगा।

+3

आप यह कहना चाहते हैं कि सूची <> कार्यान्वयन की बात आती है तो एक सरणी है? –

+2

@ डैनियल: हाँ, एक बढ़ने योग्य सरणी। – sepp2k

+1

@ डैनियलमोस्मंडर: [हां] (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx): * सूची (टी का) वर्ग अर्रेलिस्ट वर्ग का सामान्य समकक्ष है। यह एक सरणी का उपयोग करके आईएलआईस्ट (टी) जेनेरिक इंटरफ़ेस लागू करता है जिसका आकार गतिशील रूप से आवश्यकतानुसार बढ़ाया जाता है। * – Jon

1

मैं यह पूछ रहा हूं क्योंकि मेरे ज्ञान के अनुसार, .NET में टेम्पलेट (जेनेरिक) विशेषज्ञता नहीं है।

नेट में इस तरह के टेम्पलेट विशेषज्ञता नहीं है कि आप (प्रोग्रामर के रूप में) प्रकार तर्कों के आधार पर अलग-अलग कोड की आपूर्ति कर सकते हैं। लेकिन संकलक अभी भी (या करता है) संदर्भ प्रकार के लिए मूल्य प्रकारों के लिए अलग-अलग कोड उत्पन्न कर सकता है, यानी (जावा में विपरीत) मूल्य प्रकार को सामान्य कंटेनर में डालकर बॉक्स नहीं किया जाता है। वे कुशलता से संग्रहीत हैं।

5

List<T> एक सरणी T[] का मालिक है। यह इस सरणी के लिए घातीय वृद्धि रणनीति का उपयोग करता है, इसलिए n तत्वों वाली एक सूची में आम तौर पर n से बड़े आकार के साथ बैकिंग सरणी होती है। इसके अलावा छोटे सरणी को कचरा इकट्ठा करने की आवश्यकता होती है, जो लोहे पर होने के लिए पर्याप्त होने पर परेशान हो सकती है।

लेकिन आप मैन्युअल रूप से क्षमता निर्दिष्ट करके इसे से बच सकते हैं, उदाहरण के लिए एक निर्माता पैरामीटर के रूप में। फिर वांछित क्षमता वाला एक सरणी आवंटित की जाएगी, इसलिए आप उपरोक्त दोनों समस्याओं से बचें।

इसके अलावा List<T> में सूची ऑब्जेक्ट के लिए एक छोटा ओ (1) ओवरहेड है।


लेकिन जेनिक्स का उपयोग करते समय प्रति तत्व ओवरहेड नहीं है। रनटाइम आपके द्वारा पास किए जाने वाले प्रत्येक मान प्रकार के लिए एक विशेष संस्करण बनाता है। तत्वों का कोई मुक्केबाजी नहीं होता है।

लेकिन आप सी ++ शैली टेम्पलेट विशेषज्ञता का उपयोग नहीं कर सकते हैं, जहां आप प्रभावी रूप से कुछ प्रकार के पैरामीटर के लिए कार्यान्वयन को अधिभारित करते हैं। सभी जेनेरिक इंस्टीटेशंस समान सी # कोड साझा करते हैं।

यानी कोई विशेष आईएल कोड नहीं है, लेकिन प्रत्येक मान प्रकार को एक ही स्रोत कोड के आधार पर एक विशेष मशीन कोड कार्यान्वयन मिलता है।

1

सूचियों का उपयोग करना सादे सरणी का उपयोग करने से अधिक व्यावहारिक है। प्रदर्शन और स्मृति खपत की कुंजी एक सूची की क्षमता है। डिफ़ॉल्ट रूप से यह 4 के मान से शुरू होता है और 8, 16, 32, 64, ... तक बढ़ जाता है जब भी सूची के तत्व परिभाषित क्षमता तक पहुंच जाते हैं। प्रत्येक वृद्धि का एक आंतरिक पुन: आवंटन और Array.Copy में अनुवाद किया जाता है। इसलिए यदि आपके पास 1000 आइटमों की एक सूची है और आप एक दिन में 100 आइटम की अपेक्षा करते हैं, तो आप 1200 की क्षमता (100% पूर्वानुमान में त्रुटि मार्जिन) की सूची को तुरंत चालू कर सकते हैं। जब भी आप 10001 आइटम जोड़ते हैं, और निश्चित रूप से निरंतर पुन: आवंटन और ऐरे। मौजूदा 1000 आइटमों को भरने के लिए कॉपी करें, तो आप 2000 आइटमों के लिए फिर से आवंटन से बचेंगे।

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