অ্যারে, হিপ এবং স্ট্যাক এবং মান ধরণের


134
int[] myIntegers;
myIntegers = new int[100];

উপরের কোডে, নতুন ইনট [100] হিপটিতে অ্যারে তৈরি করছে? সিএলআর সি এর মাধ্যমে আমি যা পড়েছি তা থেকে উত্তরটি হ্যাঁ। তবে আমি যা বুঝতে পারি না, তা হ'ল অ্যারের অভ্যন্তরে প্রকৃত ইন্টের কি হয়। এগুলি মান ধরণের হিসাবে, আমি অনুমান করতে পারি যে তাদের বক্স করা হবে, যেমন আমি উদাহরণস্বরূপ, প্রোগ্রামের অন্যান্য অংশগুলিতে আমার ইন্টিজারদের পাস করতে পারি এবং তারা যদি সারাক্ষণ এটির উপর থেকে থাকে তবে তা স্ট্যাক আপ করতে হবে । নাকি আমি ভুল করছি? আমি অনুমান করতাম যে তারা ঠিক বক্স হয়ে যাবে এবং যতক্ষণ অ্যারে বিদ্যমান থাকবে ততক্ষণ স্তূপে বাস করবে।

উত্তর:


289

আপনার অ্যারে গাদা বরাদ্দ করা হয়, এবং 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অ্যারের ঠিকানা, অ্যারের অনুলিপি নয়


52
আমি নোট করেছি যে সমস্ত স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের মধ্যে সঞ্চয় করা আছে যে বিবৃতিটি সঠিক নয়। স্থানীয় ভেরিয়েবলগুলি যে কোনও বেনামে ফাংশনের বহিরাগত ভেরিয়েবলগুলি গাদাতে সংরক্ষণ করা হয়। পুনরুদ্ধারকারী ব্লকের স্থানীয় ভেরিয়েবলগুলি হিপে সংরক্ষণ করা হয়। অ্যাসিঙ্ক ব্লকের স্থানীয় ভেরিয়েবলগুলি হিপে সংরক্ষণ করা হয়। স্থানীয় ভেরিয়েবলগুলি যা নিবন্ধভুক্ত রয়েছে তা স্ট্যাক বা হিপ উভয়কেই সংরক্ষণ করা হয়। স্থানীয় ভেরিয়েবলগুলি যে এলিডযুক্ত তা স্ট্যাক বা হিপ উভয়কেই সংরক্ষণ করা হয়।
এরিক লিপার্ট

5
এলওএল, সর্বদা নিট-পিকার, মিঃ লিপার্ট। :) আমি উল্লেখ করতে বাধ্য হচ্ছি যে আপনার দ্বিতীয় দুটি মামলা বাদে তথাকথিত "স্থানীয়" সংকলনের সময় স্থানীয় হতে বন্ধ করে দিয়েছেন। বাস্তবায়ন তাদের শ্রেণীর সদস্যদের মর্যাদায় উন্নীত করে, একমাত্র কারণেই তারা স্তূপে সঞ্চিত থাকে। সুতরাং এটি কেবল একটি বাস্তবায়ন বিশদ (স্নিকার)। অবশ্যই, রেজিস্টার স্টোরেজটি এমনকি নিম্ন-স্তরের বাস্তবায়ন বিশদ এবং এলিজেন গণনা করে না।
পি বাবা

3
অবশ্যই, আমার পুরো পোস্টটি বাস্তবায়নের বিশদ, তবে, আমি নিশ্চিত যে আপনি বুঝতে পেরেছেন, এটি সমস্ত পরিবর্তনশীল এবং মানগুলির ধারণাটি পৃথক করার প্রয়াসে ছিল । একটি ভেরিয়েবল (একে স্থানীয়, ক্ষেত্র, প্যারামিটার বলুন) যাই হোক না কেন স্ট্যাক, হিপ বা অন্য কোনও বাস্তবায়ন-সংজ্ঞায়িত জায়গায় সংরক্ষণ করা যেতে পারে, তবে এটি আসলে কী গুরুত্বপূর্ণ তা নয়। সবচেয়ে গুরুত্বপূর্ণ, ভেরিয়েবলটি যে প্রতিনিধিত্ব করে তার মূল্যটি সরাসরি সঞ্চয় করে বা অন্যত্র সঞ্চিত সেই মানটির একটি রেফারেন্স কিনা তা। এটি গুরুত্বপূর্ণ কারণ এটি অনুলিপি শব্দার্থবিজ্ঞানের উপর প্রভাব ফেলে: ভেরিয়েবলটি অনুলিপি করে তার মান বা তার ঠিকানাটি অনুলিপি করে কিনা।
পি ড্যাডি

16
আমার চেয়ে "লোকাল ভেরিয়েবল" হওয়ার অর্থ কী তা বোঝার জন্য আপনার কাছে আলাদা ধারণা রয়েছে। আপনি মনে করেন যে "স্থানীয় পরিবর্তনশীল" এর প্রয়োগের বিশদ দ্বারা চিহ্নিত করা হয়েছে । এই বিশ্বাসটি সি # স্পেসিফিকেশনে আমি সচেতন যে কোনও কিছু দ্বারা ন্যায়সঙ্গত নয়। একজন স্থানীয় পরিবর্তনশীল আসলে একটি পরিবর্তনশীল একটি ব্লক যার ভিতরে ঘোষিত হয় নাম হয় সুযোগ শুধুমাত্র ব্লক যুক্ত ঘোষণা স্থান সর্বত্র। আমি আপনাকে আশ্বাস দিচ্ছি যে স্থানীয় পরিবর্তনশীলগুলি, একটি বাস্তবায়ন বিশদ হিসাবে, একটি ক্লোজার ক্লাসের ক্ষেত্রগুলিতে উত্তোলন করা হয়েছে, এখনও সি # এর বিধি অনুসারে স্থানীয় পরিবর্তনশীল
এরিক লিপার্ট

15
এটি বলেছিল, অবশ্যই আপনার উত্তরটি দুর্দান্ত; পয়েন্ট যে মান থেকে ধারণার দিক থেকে ভিন্ন ভেরিয়েবল এক যে চাহিদা হিসাবে প্রায়ই, যেহেতু এটি মৌলিক তৈরি করা এবং যত জোরে সম্ভব হয়। এবং তবুও প্রচুর লোক তাদের সম্পর্কে আজব গল্পগুলিকে বিশ্বাস করে! ভাল লড়াইয়ের জন্য আপনার পক্ষে খুব ভাল।
এরিক লিপার্ট

23

হ্যাঁ অ্যারেরটি গাদাতে অবস্থিত হবে।

অ্যারের ভিতরে থাকা ইনটগুলি বক্স করা হবে না। স্তূপে একটি মান ধরণের উপস্থিত থাকার কারণে এটি প্রয়োজনীয় নয় যে এটি বক্স করা হবে। বক্সিং কেবল তখনই ঘটবে যখন কোনও মান টাইপ, যেমন int, টাইপ অবজেক্টের রেফারেন্সে বরাদ্দ করা হয়।

উদাহরণ স্বরূপ

বক্স করে না:

int i = 42;
myIntegers[0] = 42;

ইসলাম:

object i = 42;
object[] arr = new object[10];  // no boxing here 
arr[0] = 42;

আপনি এই বিষয়টিতে এরিকের পোস্টটিও দেখতে চাইতে পারেন:


1
তবে আমি তা পাই না। স্ট্যাকের জন্য মূল্য ধরণের বরাদ্দ করা উচিত নয়? অথবা মান এবং রেফারেন্স উভয় ধরণেরই গাদা বা স্ট্যাক উভয়ই বরাদ্দ করা যায় এবং এগুলি কেবলমাত্র সেগুলি কেবলমাত্র এক জায়গায় বা অন্য কোনও জায়গায় সংরক্ষণ করা হয়?
ইলিজিয়াম গ্রাস করেছে

4
@ জর্জে, কোনও মানের প্রকারের সাথে কোনও রেফারেন্স টাইপ মোড়ক / ধারক স্ট্যাকটিতে বাস করবে। তবে একবার এটি কোনও রেফারেন্স টাইপের ধারকের মধ্যে ব্যবহার করা হলে এটি গাদা হয়ে থাকবে। একটি অ্যারে একটি রেফারেন্স টাইপ এবং অতএব int এর জন্য মেমরিটি গাদা হতে হবে।
জারেডপাড়

2
@ জর্জি: রেফারেন্সের ধরণগুলি কেবল স্তূপে থাকে, কখনও স্ট্যাকের উপরে থাকে না। বিপরীতক্রমে, কোনও রেফারেন্স টাইপের একটি বস্তুতে স্ট্যাকের অবস্থানের মধ্যে একটি পয়েন্টার সংরক্ষণ করা (যাচাইযোগ্য কোডে) অসম্ভব।
আন্তন টিখি

1
আমি মনে করি আপনি অর্ডার [0] এ নিয়োগ করতে চেয়েছিলেন। ধ্রুবক অ্যাসাইনমেন্টটি এখনও "42" এর বক্সিংয়ের কারণ হয়ে দাঁড়াবে, তবে আপনি তৈরি করেছেন, তাই আপনি এটিও ব্যবহার করতে পারেন ;-)
মার্কাস গ্রিপ

@ অ্যান্টনটাইখ্য: কোনও সিএলআর বলার বিষয়ে আমি সচেতন যে এমন কোনও নিয়ম নেই যা বিশ্লেষণ থেকে বাঁচতে পারে না। যদি এটি সনাক্ত করে যে কোনও বস্তু এটি তৈরির ফাংশনটির জীবদ্দশায় কখনই রেফারেন্স করা হবে না, তবে স্ট্যাকের উপর অবজেক্টটি নির্মাণের জন্য এটি সম্পূর্ণরূপে বৈধ - এবং আরও ভাল rable "মান টাইপ" এবং "রেফারেন্স টাইপ" মূলত বর্ণনা করে যে ভেরিয়েবলের দ্বারা নেওয়া স্মৃতিটিতে কী আছে, যেখানে বস্তুটি বাস করে তার উপর কঠোর এবং দ্রুত নিয়ম নয়।
সিএইচও

21

কী হচ্ছে তা বোঝার জন্য এখানে কিছু তথ্য দেওয়া হল:

  • অবজেক্ট সর্বদা গাদা উপর বরাদ্দ করা হয়।
  • গাদাতে কেবলমাত্র বস্তু রয়েছে।
  • মান ধরণের হয় স্ট্যাকের উপর বরাদ্দ করা হয়, বা গাদা উপর একটি বস্তুর অংশ।
  • একটি অ্যারে একটি বস্তু।
  • একটি অ্যারেতে কেবলমাত্র মান ধরণের থাকতে পারে।
  • একটি অবজেক্ট রেফারেন্স একটি মান প্রকার।

সুতরাং, আপনার যদি একটি পূর্ণসংখ্যার অ্যারে থাকে তবে অ্যারেরটি হিপগুলিতে বরাদ্দ করা হয় এবং এটিতে যে সংখ্যক পূর্ণসংখ্যা রয়েছে সেগুলি হিপটিতে অ্যারে অবজেক্টের অংশ। পূর্ণসংখ্যা হিপগুলিতে অ্যারের অবজেক্টের অভ্যন্তরে থাকে, পৃথক পৃথক বস্তু হিসাবে নয়, সুতরাং সেগুলি বাক্সযুক্ত নয়।

আপনার যদি স্ট্রিংগুলির একটি অ্যারে থাকে তবে এটি সত্যই স্ট্রিং রেফারেন্সের অ্যারে। রেফারেন্সগুলি মান প্রকার হিসাবে হ'ল এগুলি স্তূপের অ্যারে অবজেক্টের অংশ হবে। আপনি যদি অ্যারেটিতে একটি স্ট্রিং অবজেক্ট রাখেন তবে আপনি আসলে স্ট্রিং অবজেক্টের রেফারেন্সটি অ্যারেতে রেখেছেন এবং স্ট্রিংটি হিপগুলিতে একটি পৃথক বস্তু।


হ্যাঁ, রেফারেন্সগুলি হুবহু মানের ধরণের মতো আচরণ করে তবে আমি লক্ষ্য করেছি যে তাদের সাধারণত সেভাবে বলা হয় না, বা মানের ধরণের মধ্যে অন্তর্ভুক্ত করা হয় না। উদাহরণস্বরূপ দেখুন (তবে এরকম আরও অনেকগুলি রয়েছে) msdn.microsoft.com/en-us/library/s1ax56ch.aspx
হেন্ক হলটারম্যান

@ হেনক: হ্যাঁ, আপনি ঠিক বলেছেন যে উল্লেখগুলি মান ধরণের ভেরিয়েবলগুলির মধ্যে তালিকাভুক্ত নয়, তবে যখন তাদের জন্য মেমরি কীভাবে বরাদ্দ করা হয় তারা প্রতিটি সম্মানের মান ধরণের হয় এবং এটি উপলব্ধি করতে খুব দরকারী যে মেমরি বরাদ্দ কীভাবে সব একসাথে ফিট। :)
গুফা

আমি 5 তম বিন্দুকে সন্দেহ করি, "একটি অ্যারেতে কেবলমাত্র মান ধরণের থাকতে পারে।" স্ট্রিং অ্যারে সম্পর্কে কি? স্ট্রিং [] স্ট্রিংস = নতুন স্ট্রিং [4];
সুনীল পুরুষোথমন

9

আমি মনে করি আপনার প্রশ্নের মূল অংশটি রেফারেন্স এবং মান ধরণের সম্পর্কে একটি ভুল ধারণা রয়েছে। এটি সম্ভবত প্রতি নেট। এবং জাভা বিকাশকারীদের সাথে লড়াই করে।

একটি অ্যারে হ'ল মানগুলির একটি তালিকা। যদি এটি একটি রেফারেন্স টাইপের string[]অ্যারে হয় ( তবে ক ) বলুন তবে অ্যারে stringহ্যাপের বিভিন্ন অবজেক্টের রেফারেন্সের একটি তালিকা , কারণ একটি রেফারেন্স একটি রেফারেন্স টাইপের মান । অভ্যন্তরীণভাবে, এই উল্লেখগুলি মেমরির কোনও ঠিকানার পয়েন্টার হিসাবে প্রয়োগ করা হয়। আপনি যদি এটি কল্পনা করতে চান তবে এ জাতীয় অ্যারেটি মেমরির মতো (হিপে) দেখতে পাবেন:

[ 00000000, 00000000, 00000000, F8AB56AA ]

এটি হ'ল stringঅ্যারেগুলিতে 4 টি উল্লেখ রয়েছে string(এখানে নম্বরগুলি হেক্সাডেসিমাল) contains বর্তমানে কেবল সর্বশেষে stringকোনও কিছুতে নির্দেশ করা হয় (বরাদ্দকালে সমস্ত শূন্যের মধ্যে মেমরির সূচনা হয়), এই অ্যারেটি মূলত সি # তে এই কোডের ফলাফল হবে:

string[] strings = new string[4];
strings[3] = "something"; // the string was allocated at 0xF8AB56AA by the CLR

উপরের অ্যারেটি 32 বিট প্রোগ্রামে থাকবে। Bit৪ বিটের একটি প্রোগ্রামে, উল্লেখগুলি দ্বিগুণ F8AB56AAহয়ে যাবে ( হবে 00000000F8AB56AA)।

আপনি মান ধরনের একটি অ্যারের যদি (একটি বলে int[]) তাহলে এরে, পূর্ণসংখ্যার একটি তালিকা রয়েছে যেমন মান একটি মান ধরনের হয় মান নিজেই (তাই নাম)। এই জাতীয় অ্যারের দৃশ্যায়নটি হ'ল:

[ 00000000, 45FF32BB, 00000000, 00000000 ]

এটি 4 টি পূর্ণসংখ্যার একটি অ্যারে, যেখানে কেবলমাত্র দ্বিতীয় ইন্টের জন্য একটি মান নির্ধারিত হয় (1174352571, যা সেই হেক্সাডেসিমাল সংখ্যার দশমিক প্রতিনিধিত্ব) এবং বাকী পূর্ণসংখ্যা 0 হবে (যেমন আমি বলেছি, স্মৃতি শূন্যে আরম্ভ করা হয়) এবং হেক্সাডেসিমালে 00000000 দশমিক 0 হয়)। এই অ্যারে উত্পাদনকারী কোডটি হ'ল:

 int[] integers = new int[4];
 integers[1] = 1174352571; // integers[1] = 0x45FF32BB would be valid too

এই int[]অ্যারে এছাড়াও স্তূপে সংরক্ষণ করা হবে।

অন্য উদাহরণ হিসাবে, একটি short[4]অ্যারের স্মৃতিটি দেখতে এই রকম হবে:

[ 0000, 0000, 0000, 0000 ]

হিসাবে মান একটি এর short2 বাইট সংখ্যা।

যেখানে কোনও মান ধরণের সংরক্ষণ করা হয়, কেবল প্রয়োগের বিশদ যেমন এরিক লিপার্ট এখানে খুব ভাল ব্যাখ্যা করেছেন , মান এবং রেফারেন্সের ধরণের (আচরণের মধ্যে পার্থক্য) এর মধ্যে পার্থক্য সহজাত নয়।

যখন আপনি একটি পদ্ধতি কিছু পাস (হতে যে একটি রেফারেন্স টাইপ বা একটি মান প্রকার) তারপর একটি কপি এর মান ধরনের আসলে পদ্ধতি প্রেরণ করা হয়। একটি রেফারেন্স টাইপের ক্ষেত্রে, মানটি একটি রেফারেন্স (এটি মেমরির এক টুকরোটির জন্য একটি পয়েন্টার হিসাবে মনে করুন, যদিও এটি একটি বাস্তবায়নের বিশদও রয়েছে) এবং কোনও মান টাইপের ক্ষেত্রে, মানটিই জিনিস।

// Calling this method creates a copy of the *reference* to the string
// and a copy of the int itself, so copies of the *values*
void SomeMethod(string s, int i){}

আপনি যদি কোনও মান প্রকারকে একটি রেফারেন্স টাইপে রূপান্তর করেন তবেই বক্সিং হয় । এই কোড বাক্স:

object o = 5;

আমি বিশ্বাস করি "একটি বাস্তবায়ন বিশদ" হ'ল ফন্ট-আকার: 50px হওয়া উচিত। ;)
সিস্ভ করুন

2

এইগুলিতে @ পি ড্যাডির উপরের উত্তর চিত্রিত চিত্রগুলি

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এবং আমি আমার স্টাইলে সম্পর্কিত বিষয়গুলি চিত্রিত করেছি।

এখানে চিত্র বর্ণনা লিখুন


@ পি বাবা আমি চিত্রিত করেছি। ভুল অংশ আছে কিনা তা পরীক্ষা করুন। এবং আমার কিছু অতিরিক্ত প্রশ্ন আছে। ১. আমি যখন 4 দৈর্ঘ্যের ইন টাইপ অ্যারে তৈরি করি তখন দৈর্ঘ্যের তথ্য (4) সবসময় মেমরিতেও সংরক্ষণ করা হয়?
ইয়ংমিন পার্ক

২. দ্বিতীয় দৃষ্টান্তে অনুলিপিযুক্ত অ্যারে ঠিকানাটি কোথায় সংরক্ষণ করা হয়? এটি কি একই স্ট্যাক অঞ্চল যেখানে ইনট্রে অ্যাড্রেসটি সঞ্চয় করা আছে? এটি কি অন্য স্ট্যাক কিন্তু একই ধরণের স্ট্যাক? এটি কি আলাদা ধরণের স্ট্যাক? ৩. কম 32-বিট / উচ্চ 32-বিট বলতে কী বোঝায়? ৪. যখন আমি নতুন কীওয়ার্ড ব্যবহার করে স্ট্যাকের উপরে মূল্য প্রকার (এই উদাহরণে, কাঠামো) বরাদ্দ করি তখন রিটার্নের মান কী হবে? এটা কি ঠিকানা? আমি যখন এই বিবৃতিটি কনসোল দ্বারা পরীক্ষা করছিলাম rite রাইটলাইন (ভালটাইপ), এটি কনসোলএপ.ভালটাইপের মতো বস্তুর মতো সম্পূর্ণ যোগ্য নামটি প্রদর্শন করবে would
ইয়ংমিন পার্ক

5. ভালটাইপ.আই = 200; এই বিবৃতিটির অর্থ কি আমি ভ্যালটাইপের ঠিকানা পেয়েছি, এই ঠিকানার মাধ্যমে আমি আমি অ্যাক্সেস করি এবং ঠিক সেখানে আমি 200 সংরক্ষণ করি তবে "স্ট্যাকের উপরে"।
ইয়ংমিন পার্ক

1

পূর্ণসংখ্যার একটি অ্যারের গাদাতে বরাদ্দ করা হয়, এর চেয়ে বেশি কিছুই নয়, কিছু কম নয়। মাই ইন্টিজার্স বিভাগটি শুরু করার জন্য রেফারেন্স দেয় যেখানে ইনটগুলি বরাদ্দ করা হয়। সেই রেফারেন্সটি স্ট্যাকের উপরে অবস্থিত।

যদি আপনার রেফারেন্স টাইপ অবজেক্টগুলির একটি অ্যারে থাকে তবে অবজেক্ট টাইপের মতো, মাইওবজেক্টস [], স্ট্যাকের উপরে অবস্থিত, মানগুলির গুচ্ছটির সাথে উল্লেখ করবে যা বস্তুগুলি তাদেরকে রেফারেন্স করে।

সংক্ষিপ্তসার হিসাবে, আপনি কিছু ফাংশনগুলিতে মাইনজারগুলি পাস করলে আপনি কেবলমাত্র সেই স্থানটির রেফারেন্সটি পাস করেন যেখানে আসল গুচ্ছটি বরাদ্দ করা হয়।


1

আপনার উদাহরণ কোডটিতে কোনও বক্সিং নেই।

মানের ধরণগুলি আপনার ইটের অ্যারেতে যেমন গাদা থাকে তেমন বেঁচে থাকতে পারে। অ্যারেটি গাদাতে বরাদ্দ করা হয় এবং এটি কীট সংরক্ষণ করে, যা মান ধরণের হয়ে থাকে। অ্যারের সামগ্রীগুলি ডিফল্ট (ইনট) তে শুরু হয়, যা শূন্য হয়।

একটি শ্রেণীর বিবেচনা করুন যাতে একটি মান প্রকার থাকে:


    class HasAnInt
    {
        int i;
    }

    HasAnInt h = new HasAnInt();

পরিবর্তনশীল এইচটি হ্যাসঅ্যানআইন্টের একটি উদাহরণকে বোঝায় যা স্তূপে বাস করে। এটি কেবল একটি মান ধরণের থাকে। এটি পুরোপুরি ঠিক আছে, 'আমি' কেবল ক্লাসে থাকা অবস্থায় স্তূপে বাস করার ঘটনা ঘটে। এই উদাহরণে কোনও বক্সিংও নেই।


1

প্রত্যেকেই যথেষ্ট বলেছে, তবে কেউ যদি গাদা, স্ট্যাক, স্থানীয় ভেরিয়েবল এবং স্ট্যাটিক ভেরিয়েবল সম্পর্কে কোনও পরিষ্কার (তবে বেসরকারী) নমুনা এবং ডকুমেন্টেশন সন্ধান করছেন তবে .NET- এ মেমোরি সম্পর্কিত সম্পূর্ণ জন স্কিটির নিবন্ধটি দেখুন কোথায়

উদ্ধৃতাংশ:

  1. প্রতিটি স্থানীয় ভেরিয়েবল (যেমন একটি পদ্ধতিতে ঘোষিত) স্ট্যাকের উপরে সংরক্ষণ করা হয়। এর মধ্যে রেফারেন্স প্রকারের ভেরিয়েবলগুলি অন্তর্ভুক্ত রয়েছে - ভেরিয়েবলটি নিজেই স্ট্যাকের মধ্যে থাকে তবে মনে রাখবেন যে একটি রেফারেন্স টাইপের ভেরিয়েবলের মান কেবল একটি রেফারেন্স (বা নাল) হয়, অবজেক্টটি নিজেই নয়। পদ্ধতির পরামিতিগুলি স্থানীয় ভেরিয়েবল হিসাবেও গণনা করা হয় তবে এগুলি যদি রেফ সংশোধক হিসাবে ঘোষিত হয় তবে তারা তাদের নিজস্ব স্লট পায় না, তবে কলিং কোডে ব্যবহৃত ভেরিয়েবলের সাথে একটি স্লট ভাগ করে। আরও তথ্যের জন্য প্যারামিটার পাস করার বিষয়ে আমার নিবন্ধটি দেখুন।

  2. একটি রেফারেন্স টাইপের জন্য ইনস্ট্যান্স ভেরিয়েবলগুলি সর্বদা গাদা থাকে। বস্তু নিজেই "জীবন"।

  3. মান ধরণের জন্য ইনস্ট্যান্স ভেরিয়েবলগুলি ভেরিয়েবলের একই প্রসঙ্গে সংরক্ষণ করা হয় যা মানের ধরণটি ঘোষণা করে। উদাহরণস্বরূপ মেমরি স্লট কার্যকরভাবে উদাহরণের মধ্যে প্রতিটি ক্ষেত্রের স্লট ধারণ করে। এর অর্থ (পূর্ববর্তী দুটি পয়েন্ট দেওয়া হয়েছে) যে কোনও পদ্ধতির মধ্যে ঘোষিত স্ট্রাক্ট ভেরিয়েবল সর্বদা স্ট্যাকের উপরে থাকবে, অন্যদিকে স্ট্রাক্ট ভেরিয়েবল যা শ্রেণীর উদাহরণ ক্ষেত্র, সেগুলি হিপটিতে থাকবে।

  4. প্রতিটি স্ট্যাটিক ভেরিয়েবলটি রেফারেন্স টাইপের মধ্যে বা মানের ধরণের মধ্যে নির্ধারিত না করেই গাদাতে সংরক্ষণ করা হয়। মোট কতগুলি দৃষ্টান্ত তৈরি করা হয়েছে তা মোট একমাত্র স্লট। (যদিও এই এক স্লটের অস্তিত্বের জন্য কোনও দৃষ্টান্ত তৈরি করার দরকার নেই।) ভেরিয়েবলগুলি কীভাবে রাখে তার বিবরণ জটিল তবে বিষয়টির একটি এমএসডিএন নিবন্ধে বিশদভাবে ব্যাখ্যা করা হয়েছে explained

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.