আপনার অ্যারে গাদা বরাদ্দ করা হয়, এবং ints বক্স করা হয় না।
আপনার বিভ্রান্তির কারণ সম্ভবত লোকেরা বলেছে যে রেফারেন্সের ধরণগুলি গাদাতে বরাদ্দ করা হয়েছে, এবং মান ধরণের স্ট্যাকের উপর বরাদ্দ করা হয়েছে। এটি সম্পূর্ণ সঠিক প্রতিনিধিত্ব নয়।
সমস্ত স্থানীয় ভেরিয়েবল এবং পরামিতি স্ট্যাকের জন্য বরাদ্দ করা হয়। এর মধ্যে মানের ধরণ এবং রেফারেন্স উভয়ই অন্তর্ভুক্ত। দুটির মধ্যে পার্থক্য কেবল ভেরিয়েবলের মধ্যে সংরক্ষণ করা। আশ্চর্যজনকভাবে, কোনও মান ধরণের জন্য, প্রকারের মানটি সরাসরি চলকগুলিতে সংরক্ষণ করা হয়, এবং একটি রেফারেন্স টাইপের জন্য, ধরণের মানটি হিপে সংরক্ষণ করা হয়, এবং এই মানটির একটি রেফারেন্স যা ভেরিয়েবলে সঞ্চিত থাকে।
ক্ষেত্রের জন্য একই। যখন সমষ্টিগত ধরণের (ক class
বা ক 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 ├───────────────────┤
│ এল │
│ │
16 └───────────────────┘
এখন আপনি ধরনের, একটি ফাংশন তিন স্থানীয় ভেরিয়েবল ছিল যদি RefType
, ValType
এবং int[]
, এভাবে:
RefType refType;
ValType valType;
int[] intArray;
তাহলে আপনার স্ট্যাকটি দেখতে দেখতে এটি দেখতে পারা যায়:
0
│ refType │
4
│ ভালটাইপ │
│ │
│ │
│ │
20 ├───────────────────┤
│ intArray │
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 │ - `valType.S` এর হিপ ঠিকানা`
X 0x44556677 │ - 32 valType.L` এর 32-বিট কম `
X 0x00112233 │ - 32 valType.L` এর উচ্চ 32-বিট `
20 ├───────────────────┤
│ 0x4AA4C288 │ - `intArray` এর হিপ ঠিকানা`
24 └───────────────────┘
ঠিকানার ঠিকানা 0x4A963B68
(মান refType
) এরকম কিছু হবে:
0
│ 100 │ - `refType.I` এর মান`
4
`0x4A984D88 │ -` refType.S` এর হিপ ঠিকানা `
8 ├───────────────────┤
X 0x89ABCDEF │ - 32 refType.L` এর 32-বিট কম `
X 0x01234567 │ - 32 refType.L` এর উচ্চ 32-বিট `
16 └───────────────────┘
ঠিকানার ঠিকানা 0x4AA4C288
(মান intArray
) এরকম কিছু হবে:
0
│ 4 │ - অ্যারের দৈর্ঘ্য
4
│ 300 │ - `intArray [0]`
8 ├───────────────────┤
│ 301 │ - `intArray [1]`
12 ├───────────────────┤
│ 302 │ - `intArray [2]`
16 ├───────────────────┤
│ 303 │ - `intArray [3]`
20 └───────────────────┘
এখন, আপনি যদি intArray
অন্য কোনও কার্যক্রমে পৌঁছেছেন তবে স্ট্যাকের উপরে চাপানো মানটি হবে 0x4AA4C288
অ্যারের ঠিকানা, অ্যারের অনুলিপি নয় ।