आपका सरणी ढेर पर आवंटित किया गया है, और इन्ट्स बॉक्सिंग नहीं हैं।
आपके भ्रम का स्रोत होने की संभावना है क्योंकि लोगों ने कहा है कि संदर्भ प्रकार ढेर पर आवंटित किए गए हैं, और मूल्य प्रकार स्टैक पर आवंटित किए गए हैं। यह पूरी तरह से सटीक प्रतिनिधित्व नहीं है।
सभी स्थानीय चर और पैरामीटर स्टैक पर आवंटित किए जाते हैं। इसमें मूल्य प्रकार और संदर्भ प्रकार दोनों शामिल हैं। दोनों के बीच अंतर केवल वही है जो चर में संग्रहीत है। मूल्य के प्रकार के लिए, आश्चर्यजनक रूप से, प्रकार का मूल्य सीधे चर में संग्रहीत किया जाता है, और एक संदर्भ प्रकार के लिए, प्रकार का मूल्य ढेर पर संग्रहीत किया जाता है, और इस मान का एक संदर्भ चर में संग्रहीत होता है।
वही खेतों के लिए रखती है। जब किसी कुल प्रकार ( class
या a) के उदाहरण के लिए मेमोरी आवंटित की जाती हैstruct
) के , तो इसके प्रत्येक इंस्टेंस फ़ील्ड के लिए भंडारण शामिल होना चाहिए। संदर्भ-प्रकार के क्षेत्रों के लिए, यह संग्रहण केवल मान का संदर्भ रखता है, जिसे बाद में हीप पर आबंटित किया जाएगा। मूल्य-प्रकार के क्षेत्रों के लिए, यह संग्रहण वास्तविक मूल्य रखता है।
तो, निम्न प्रकार दिए गए:
class RefType{
public int I;
public string S;
public long L;
}
struct ValType{
public int I;
public string S;
public long L;
}
इन प्रकारों में से प्रत्येक के मान के लिए 16 बाइट्स मेमोरी (32-बिट शब्द आकार मानकर) की आवश्यकता होगी। I
प्रत्येक मामले में फ़ील्ड अपने मूल्य को संग्रहीत करने के लिए 4 बाइट्स लेता है, फ़ील्ड S
अपने संदर्भ को संग्रहीत करने के लिए 4 बाइट्स लेता है, और फ़ील्ड L
अपने मूल्य को संग्रहीत करने के लिए 8 बाइट्स लेता है। तो दोनों के मूल्य के लिए स्मृति RefType
और ValType
इस तरह दिखता है:
0 ┌───────────────────┐
│ मैं │
4 ├───────────────────┤
│ एस │
8 ├───────────────────┤
│ L │
│ │
16 └───────────────────┘
अब अगर आपके पास एक फ़ंक्शन में तीन स्थानीय चर हैं, प्रकार RefType
के ValType
, और int[]
, जैसे:
RefType refType;
ValType valType;
int[] intArray;
तब आपका स्टैक इस तरह दिख सकता है:
0 ┌───────────────────┐
T RefType │
4 ├───────────────────┤
│ वेल्टाइप │
│ │
│ │
│ │
20 ├───────────────────┤
Ray इंटेरियर ray
24 └───────────────────┘
यदि आप इन स्थानीय चर को मान असाइन करते हैं, जैसे:
refType = new RefType();
refType.I = 100;
refType.S = "refType.S";
refType.L = 0x0123456789ABCDEF;
valType = new ValType();
valType.I = 200;
valType.S = "valType.S";
valType.L = 0x0011223344556677;
intArray = new int[4];
intArray[0] = 300;
intArray[1] = 301;
intArray[2] = 302;
intArray[3] = 303;
तब आपका स्टैक कुछ इस तरह दिख सकता है:
0 ┌───────────────────┐
│ 0x4A963B68 │ - `refType` का ढेर पता
4 ├───────────────────┤
│ 200 │ - `valType.I` का मान
│ 0x4A984C10 9 - `valType.S` का ढेर पता
│ 0x44556677 │ - कम 32-बिट `valType.L`
│ 0x00112233 12 - `valType.L` के 32-बिट्स
20 ├───────────────────┤
│ 0x4AA4C288 4 - `intArray` का ढेर पता
24 └───────────────────┘
पते पर मेमोरी 0x4A963B68
(मान refType
) कुछ इस तरह होगी:
0 ┌───────────────────┐
│ 100 │ - `refType.I` का मान
4 ├───────────────────┤
│ 0x4A984D88 9 - `refType.S` का ढेर पता
8 ├───────────────────┤
│ 0x89ABCDEF AB - कम 32-बिट `refType.L`
│ 0x01234567 │ - उच्च 32-बिट `refType.L`
16 └───────────────────┘
पते पर मेमोरी 0x4AA4C288
(मान intArray
) कुछ इस तरह होगी:
0 ┌───────────────────┐
Length 4 │ - सरणी की लंबाई
4 ├───────────────────┤
│ 300 │ - `इंट्रेयर [0]`
8 ├───────────────────┤
│ 301 │ - `इंट्रेयर [1]`
12 ├───────────────────┤
│ 302 │ - `इंट्रेयर [2]`
16 ├───────────────────┤
│ 303 │ - `इंट्रेयर [3]`
20 └───────────────────┘
अब, यदि आप intArray
किसी अन्य फ़ंक्शन में गए हैं, तो स्टैक पर दिया गया मान 0x4AA4C288
ऐरे का पता होगा , एरे की प्रति नहीं ।