2011-01-13 18 views

उत्तर

14

32-बिट सीएलआर के लिए, दोनों लॉक के लिए 4 बाइट, टाइप हैंडल के लिए 4 बाइट, और दो बाइट्स के लिए 8 बाइट होंगे। सरणी में, लंबाई (2 इस मामले में 2) को स्टोर करने के लिए अतिरिक्त 4 बाइट होंगे, इसलिए सरणी में 4 बाइट ओवरहेड होंगे।

आकार (रूपरेखा द्वारा निर्धारित) पर 32-बिट:
Tuple<int, int>: 16 बाइट्स
int[2]: 20 बाइट
int[1 to 2] *: 28 बाइट्स
int[2, 1]: 36 बाइट्स
64-बिट CLR पर:
Tuple<int, int>: 24 बाइट्स
int[2]: 32 बाइट्स
int[1 to 2] *: 40 बाइट्स
int[2, 1]: 48 बाइट

ध्यान दें कि मान प्रकारों के एकल-आयामी शून्य-आधारित सरणी सबसे छोटे संभव सरणी हैं। संदर्भ प्रकारों का उपयोग करने से ऑब्जेक्ट को संग्रहीत किया जा रहा है (64-बिट पर 8 बाइट्स) के लिए एक और 4 बाइट जोड़ता है। गैर-शून्य सरणी अड्डों या एकाधिक आयामों का उपयोग करने से यह एक और प्रकार का सरणी प्रकार का उपयोग करता है जो रैंक और निचली बाउंड जानकारी संग्रहीत करता है, प्रति आयाम 8 अतिरिक्त बाइट जोड़ता है।

संदर्भ:

* आप एक गैर 0 कम सी # में बंधे के साथ एक सरणी की घोषणा नहीं कर सकते हैं, तो मैं बना वाक्यविन्यास int[1 to 2]। हालांकि, आप इंडेक्स 10 और 11 पर 2 तत्वों के साथ एक सरणी बनाने के लिए Array.CreateInstance(typeof(int), new[]{2}, new[]{10}); पर कॉल कर सकते हैं। बेशक, ऐसे सरणी सीधे सी # के प्रकार सिस्टम में प्रदर्शित नहीं किए जा सकते हैं, इसलिए वे बहुत उपयोगी नहीं हैं, लेकिन वे एक दिलचस्प डेटा पॉइंट प्रदान करते हैं।

+0

Arrays एक विशेष मामला है, यहां तक ​​कि आईएल-अनुकूलित वाले भी, और इसलिए उनके पास सीएलआई में अतिरिक्त ओवरहेड है। –

0

Tuple<int, int> दो पूर्णांक फ़ील्ड के साथ कक्षा के समान स्मृति का उपयोग करता है। दूसरी तरफ एक सरणी में SSCLI में ArrayOpScript नामक एक बड़ी बड़ी आंतरिक डेटा संरचना है) जो प्रत्येक रैंक (इस मामले में एक) आकार 16 बाइट्स के लिए कम से कम 32-बाइट्स और अन्य डेटा संरचना (ArrayOpIndexSpec कहा जाता है) है। तो एक सरणी लगभग Tuple की तुलना में लगभग कई कारकों को अधिक स्मृति का उपयोग करती है।

+0

नेट 4 सीएलआर पर मेरी प्रोफाइलिंग से पता चलता है कि एक बहुआयामी सरणी भी 2-int वर्ग से केवल 20 या 24 बाइट बड़ी है। – Gabe

+0

मुझे कारण और अनुमान लगाने की कोशिश करने के बजाय इसे पहले मापा जाना चाहिए था। मेरा माप .NET4 x86 CLR में दिखाता है एक int [2] आपके उत्तर के अनुरूप एक ट्यूपल की तुलना में केवल ~ 20% अधिक स्मृति का उपभोग करता है। –

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