क्या किसी को इन दोनों के बीच स्मृति अंतर पता है? या यह आसानी से खुद को कैसे समझ पाएगा?ट्यूपल <int, int> बनाम int [2] मेमोरी उपयोग
उत्तर
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 अतिरिक्त बाइट जोड़ता है।
संदर्भ:
- http://www.codeproject.com/KB/dotnet/arrays.aspx
- http://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811
- http://msdn.microsoft.com/en-us/magazine/cc301755.aspx
* आप एक गैर 0 कम सी # में बंधे के साथ एक सरणी की घोषणा नहीं कर सकते हैं, तो मैं बना वाक्यविन्यास int[1 to 2]
। हालांकि, आप इंडेक्स 10 और 11 पर 2 तत्वों के साथ एक सरणी बनाने के लिए Array.CreateInstance(typeof(int), new[]{2}, new[]{10});
पर कॉल कर सकते हैं। बेशक, ऐसे सरणी सीधे सी # के प्रकार सिस्टम में प्रदर्शित नहीं किए जा सकते हैं, इसलिए वे बहुत उपयोगी नहीं हैं, लेकिन वे एक दिलचस्प डेटा पॉइंट प्रदान करते हैं।
ए Tuple<int, int>
दो पूर्णांक फ़ील्ड के साथ कक्षा के समान स्मृति का उपयोग करता है। दूसरी तरफ एक सरणी में SSCLI में ArrayOpScript
नामक एक बड़ी बड़ी आंतरिक डेटा संरचना है) जो प्रत्येक रैंक (इस मामले में एक) आकार 16 बाइट्स के लिए कम से कम 32-बाइट्स और अन्य डेटा संरचना (ArrayOpIndexSpec
कहा जाता है) है। तो एक सरणी लगभग Tuple
की तुलना में लगभग कई कारकों को अधिक स्मृति का उपयोग करती है।
नेट 4 सीएलआर पर मेरी प्रोफाइलिंग से पता चलता है कि एक बहुआयामी सरणी भी 2-int वर्ग से केवल 20 या 24 बाइट बड़ी है। – Gabe
मुझे कारण और अनुमान लगाने की कोशिश करने के बजाय इसे पहले मापा जाना चाहिए था। मेरा माप .NET4 x86 CLR में दिखाता है एक int [2] आपके उत्तर के अनुरूप एक ट्यूपल
- 1. IList <int> बनाम सूची <int>
- 2. MySQL मध्यम int बनाम int प्रदर्शन
- 3. std :: जोड़ी <int, int> बनाम स्ट्रक्चर दो int के
- 4. मानचित्र <int,int> डिफ़ॉल्ट मान
- 5. IQueryable <int> से <int>
- 6. MySQL: bigint बनाम int
- 7. GUID INT पहचान बनाम
- 8. सी ++ int बनाम लंबे
- 9. int बनाम एनएसएनंबर बनाम एनएसआईएनटेगर
- 10. Math.random() बनाम Random.nextInt (int)
- 11. सूची में int की पंक्ति श्रेणी <int>
- 12. int
- 13. int i बनाम int अनुक्रमणिका आदि कौन सा बेहतर है?
- 14. लंबे डबल बनाम लंबे int
- 15. कास्टिंग (int?) शून्य बनाम नया int?() - कौन सा बेहतर है?
- 16. Int प्राथमिक कुंजी - int int से अधिक
- 17. linq क्वेरी जहां int ID सूची <int>
- 18. सूची <int> परिवर्तित करने के लिए int []
- 19. प्रकार Nullable <int>
- 20. PHP सुरक्षा - (int) बनाम FILTER_VALIDATE_INT
- 21. php string int int
- 22. int * से int
- 23. एक int (*) (int)
- 24. const int = int const?
- 25. सूची <int> सी #
- 26. ++ std :: परमाणु <int>
- 27. "अस्थिर प्रकार: int() <str()"
- 28. INT
- 29. int
- 30. int का स्पष्टीकरण? बनाम पूर्णांक
Arrays एक विशेष मामला है, यहां तक कि आईएल-अनुकूलित वाले भी, और इसलिए उनके पास सीएलआई में अतिरिक्त ओवरहेड है। –