"সংকলনের সময় বরাদ্দকৃত স্মৃতি" বলতে কী বোঝায়?


159

সি এবং সি ++ এর মতো প্রোগ্রামিং ভাষায়, লোকেরা প্রায়শই স্থির এবং গতিশীল মেমোরি বরাদ্দকে বোঝায়। আমি ধারণাটি বুঝতে পারি তবে "সমস্ত স্মৃতিটি সংকলনের সময় বরাদ্দ করা হয়েছিল (সংরক্ষিত)" বাক্যাংশটি আমাকে সর্বদা বিভ্রান্ত করে।

সংকলন, যেমনটি আমি এটি বুঝতে পারি, উচ্চ স্তরের সি / সি ++ কোডটিকে মেশিন ল্যাঙ্গুয়েজে রূপান্তর করে এবং এক্সিকিউটেবল ফাইলকে আউটপুট দেয়। সংকলিত ফাইলটিতে মেমরি কীভাবে "বরাদ্দ" করা হয়? সমস্ত ভার্চুয়াল মেমরি পরিচালনার স্ট্যাম সহ র‌্যামে সর্বদা স্মৃতি বরাদ্দ করা হয় না?

সংজ্ঞা অনুসারে মেমরি বরাদ্দ একটি রানটাইম ধারণা নয়?

আমি যদি আমার সি / সি ++ কোডে 1KB স্ট্যাটিকালি বরাদ্দ করা পরিবর্তনশীল করি, তবে এটি কি একই পরিমাণে নির্বাহের আকার বাড়িয়ে তুলবে?

এটি এমন একটি পৃষ্ঠার যেখানে বাক্যাংশটি "স্ট্যাটিক বরাদ্দ" শিরোনামে ব্যবহৃত হয়।

বুনিয়াদি ফিরে যান: মেমরি বরাদ্দ, ইতিহাসের এক হাঁটা


কোড এবং ডেটা সম্পূর্ণরূপে বেশিরভাগ আধুনিক স্থাপত্যে পৃথক করা হয়। উত্স ফাইলগুলিতে একই স্থানে উভয় কোড ডেটা থাকে, তবে বিনটিতে কেবলমাত্র ডেটার উল্লেখ থাকে। এর অর্থ উত্সের স্থির ডেটা কেবলমাত্র উল্লেখ হিসাবে সমাধান করা হয়।
চোলঠি পল টিটিওপিক

উত্তর:


184

সংকলন সময়ে বরাদ্দ করা মেমরির অর্থ কম্পাইলার সংকলন সময়ে সমাধান হয় যেখানে প্রক্রিয়া মেমরির মানচিত্রের ভিতরে নির্দিষ্ট কিছু বরাদ্দ করা হবে।

উদাহরণস্বরূপ, একটি বিশ্বব্যাপী অ্যারে বিবেচনা করুন:

int array[100];

সংকলকটি অ্যারের আকার এবং একটি এর intআকার সংকলন সময়ে জানে, সুতরাং এটি সংকলন-সময় অ্যারের পুরো আকারটি জানে। এছাড়াও একটি গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে স্থিতিশীল স্টোরেজ সময়কাল থাকে: এটি প্রক্রিয়া মেমরি স্পেসের (.data / .bss বিভাগ) স্ট্যাটিক মেমরির ক্ষেত্রে বরাদ্দ করা হয়। সেই তথ্য দেওয়া, সংকলক সেই স্থির মেমরির অ্যাড্রে কী ঠিকানা হবে তা সংকলনের সময় সিদ্ধান্ত নেয়

অবশ্যই সেই মেমরি ঠিকানাগুলি ভার্চুয়াল ঠিকানা addresses প্রোগ্রামটি ধরে নিয়েছে যে এটির নিজস্ব পুরো মেমরি স্পেস রয়েছে (উদাহরণস্বরূপ 0x00000000 থেকে 0xFFFFFFFF)। এজন্য সংকলক "ঠিক আছে, অ্যারে 0x00A33211 ঠিকানায় হবে" এর মতো অনুমানগুলি করতে পারে। রানটাইমের সময় ঠিকানাগুলি এমএমইউ এবং ওএস দ্বারা বাস্তব / হার্ডওয়্যার ঠিকানায় অনুবাদ করা হয়।

মান সূচনা স্ট্যাটিক স্টোরেজ জিনিসগুলি কিছুটা আলাদা। উদাহরণ স্বরূপ:

int array[] = { 1 , 2 , 3 , 4 };

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

সংকলক দ্বারা উত্পাদিত সমাবেশের দুটি উদাহরণ এখানে রয়েছে (x86 টার্গেট সহ GCC4.8.1):

সি ++ কোড:

int a[4];
int b[] = { 1 , 2 , 3 , 4 };

int main()
{}

আউটপুট সমাবেশ:

a:
    .zero   16
b:
    .long   1
    .long   2
    .long   3
    .long   4
main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $0, %eax
    popq    %rbp
    ret

আপনি দেখতে পাচ্ছেন, মানগুলি সরাসরি সমাবেশে ইনজেকশনে থাকে। অ্যারেতে a, সংকলকটি 16 বাইটের শূন্য সূচনা উত্পন্ন করে, কারণ স্ট্যান্ডার্ড বলে যে স্ট্যাটিক সঞ্চিত জিনিসগুলি ডিফল্টরূপে শূন্যে শুরু করা উচিত:

8.5.9 (প্রারম্ভিক) [দ্রষ্টব্য]:
স্ট্যাটিক স্টোরেজ সময়কালের প্রতিটি বস্তু প্রোগ্রামের শুরুতে শূন্য-আরম্ভীকৃত হয় অন্য কোনও প্রাথমিক-আইকেশন হওয়ার আগে। কিছু ক্ষেত্রে, অতিরিক্ত সূচনা পরে করা হয়।

আমি সবসময় লোকদের তাদের কোড বিচ্ছিন্ন করার পরামর্শ দিই যাতে সি ++ কোডটি দিয়ে কম্পাইলারটি আসলে কী করে তা দেখতে। এটি স্টোরেজ ক্লাস / সময়কাল (এই প্রশ্নের মতো) থেকে উন্নত সংকলক অপ্টিমাইজেশনে প্রযোজ্য। আপনি আপনার সংকলকটি সমাবেশ উত্পন্ন করতে নির্দেশ দিতে পারেন, তবে ইন্টারনেটে বন্ধুত্বপূর্ণ উপায়ে এটি করার জন্য দুর্দান্ত সরঞ্জাম রয়েছে। আমার প্রিয় জিসিসি এক্সপ্লোরার


2
ধন্যবাদ। এটি অনেক স্পষ্ট করে। সুতরাং সংকলক "0xABC থেকে 0xXYZ অবধি ভেরিয়েবল অ্যারে [] ইত্যাদির সমান কিছু আউটপুট করে" " এবং তারপরে লোডার এটি প্রোগ্রাম চালানোর ঠিক আগে বরাদ্দ করতে ব্যবহার করে?
তালহা

1
পছন্দ করেছেন উদাহরণটি দেখতে সম্পাদনাটি দেখুন
Manu343726

2
@ সেকো আমার কাছে সহজ জিনিস রয়েছে। প্রোগ্রাম সম্পর্কে এটির একটি উল্লেখ ভার্চুয়াল মেমরির মাধ্যমে কাজ করে, তবে প্রশ্নটি ভার্চুয়াল মেমরির ক্ষেত্রে নয় কারণ আমি বিষয়টিকে প্রসারিত করি না। আমি কেবল ইঙ্গিত করছিলাম যে সংকলকটি ভার্চুয়াল মেমরির জন্য ধন্যবাদ সংকলন সময়ে মেমরি ঠিকানাগুলি সম্পর্কে অনুমানগুলি করতে পারে।
Manu343726

2
@ সেকো হ্যাঁ মিমি "জেনারেটেড" একটি ভাল শব্দ যা আমি মনে করি।
মনু 343726

2
"এটি প্রক্রিয়া মেমরি স্পেসের স্ট্যাটিক স্তন্যপায়ী অঞ্চলে বরাদ্দ করা হয়েছে" আমার প্রসেসের মেমরি স্পেসে কিছু স্থির স্তন্যপায়ী অঞ্চল বরাদ্দ করা হয়েছে এমন পড়া।
রেডিওডেফ

27

সংকলনের সময়ে বরাদ্দ করা মেমরিটির সহজ অর্থ হ'ল রান সময়ে আর বরাদ্দ থাকবে না - ম্যালোক, নতুন বা অন্যান্য গতিশীল বরাদ্দ পদ্ধতিতে কোনও কল নেই। আপনার যদি সমস্ত সময় সেই সমস্ত মেমরির প্রয়োজন না হয় তবে আপনার একটি নির্দিষ্ট পরিমাণ মেমরির ব্যবহার থাকবে।

সংজ্ঞা অনুসারে মেমরি বরাদ্দ একটি রানটাইম ধারণা নয়?

সময় চালানোর আগে মেমরিটি ব্যবহার করা হয় না , তবে বরাদ্দ শুরু হওয়ার সাথে সাথে তার বরাদ্দ শুরু হওয়ার আগে সিস্টেমের দ্বারা পরিচালিত হয়।

আমি যদি আমার সি / সি ++ কোডে 1KB স্ট্যাটিকালি বরাদ্দ করা পরিবর্তনশীল করি, তবে এটি কি একই পরিমাণে নির্বাহের আকার বাড়িয়ে তুলবে?

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


1
যদি আমি লিখি static int i[4] = {2 , 3 , 5 ,5 }এটি সম্পাদনাযোগ্য আকারে 16 বাইট দ্বারা বৃদ্ধি পাবে আপনি বলেছিলেন "কেবল স্ট্যাটিক ঘোষণার ফলে আপনার এক্সিকিউটেবলের আকার কয়েক বাইটের চেয়ে বেশি বৃদ্ধি পাবে না it শূন্য নয় এমন একটি প্রাথমিক মান দিয়ে এটি ঘোষণা করা" প্রাথমিক মান দিয়ে এটি ঘোষণা করার অর্থ কী হবে will
সুরজ জৈন

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

এটি কোথায় স্থাপন করা হয়েছে / কীভাবে এটি বরাদ্দ পায় সে সম্পর্কে এটি বাস্তবায়ন সংজ্ঞায়িত করা হয়েছে তবে আমি জানি না যে আমি জানার প্রয়োজনীয়তাটি বুঝতে পেরেছি।
মাহ

23

সংকলনের সময় বরাদ্দ করা মেমরির অর্থ হ'ল আপনি যখন প্রোগ্রামটি লোড করবেন তখন মেমরির কিছু অংশ অবিলম্বে বরাদ্দ হয়ে যাবে এবং এই বরাদ্দটির আকার এবং (আপেক্ষিক) অবস্থানটি সংকলনের সময় নির্ধারিত হবে।

char a[32];
char b;
char c;

এই 3 টি ভেরিয়েবলগুলি "সংকলনের সময়ে বরাদ্দ করা হয়", এর অর্থ হ'ল সংকলক সংকলনের সময় তাদের আকার (যা স্থির হয়) গণনা করে। ভেরিয়েবলটি aস্মৃতিতে একটি অফসেট হবে, আসুন বলি যে 0 ঠিকানার দিকে ইঙ্গিত করে, bঠিকানাটি 33 এবং c34 এ চিহ্নিত করা হবে (কোনও প্রান্তিককরণ অপ্টিমাইজেশান মনে করি না)। সুতরাং, 1Kb স্ট্যাটিক ডেটা বরাদ্দ করা আপনার কোডের আকার বাড়বে না , কারণ এটি কেবল এটির ভিতরে একটি অফসেট পরিবর্তন করবে। আসল স্থানটি লোডের সময় বরাদ্দ করা হবে

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

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


17

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

যদি 1 কে হাজার অক্ষরের একটি স্ট্রিং হয়, যা এর মতো ঘোষণা করা হয়

const char *c_string = "Here goes a thousand chars...999";//implicit \0 at end

এবং আপনি তখন ছিলেন vim your_compiled_bin, আপনি আসলে সেই স্ট্রিংটি কোথাও বিনটিতে দেখতে পাবে। সেক্ষেত্রে হ্যাঁ: এক্সিকিউটেবলটি 1 কে বড় হবে, কারণ এতে পুরো স্ট্রিং রয়েছে।
তবে, আপনি যদি স্ট্যাকের উপর ints, chars বা longs এর একটি অ্যারে বরাদ্দ করেন এবং এটিকে একটি লুপে বরাদ্দ করেন তবে এই লাইনগুলি বরাবর কিছু

int big_arr[1000];
for (int i=0;i<1000;++i) big_arr[i] = some_computation_func(i);

তারপরে, না: এটি বিন বাড়বে না ... 1000*sizeof(int)
সংকলনের সময় বরাদ্দ দ্বারা আপনি এখন বুঝতে পেরেছেন এর অর্থ (আপনার মন্তব্যের ভিত্তিতে): সংকলিত বিনটিতে সিস্টেমটি কতটা মেমরি জানতে প্রয়োজনীয় তথ্য ধারণ করে আপনার অ্যাপ্লিকেশনটির প্রয়োজনীয় স্ট্যাক আকারের তথ্যের সাথে এটি কার্যকর হলে কোন ফাংশন / ব্লকের প্রয়োজন হবে। এটি যখন আপনার বিনটি কার্যকর করবে তখন সিস্টেমটি বরাদ্দ করবে, এবং আপনার প্রোগ্রামটি একটি প্রক্রিয়া হয়ে উঠবে (ভাল, আপনার বিনকে কার্যকর করা একটি প্রক্রিয়া যা ... ভাল, আমি যা বলছি তা আপনি পেয়েছেন)।
অবশ্যই, আমি এখানে পুরো ছবি আঁকছি না: বিনটিতে আসলে বিনটি কত বড় স্ট্যাকের প্রয়োজন হবে সে সম্পর্কিত তথ্য রয়েছে। এই তথ্যের ভিত্তিতে (অন্যান্য জিনিসগুলির মধ্যে), সিস্টেমটি মেমরির একটি অংশ সংরক্ষণ করবে যা স্ট্যাক নামে পরিচিত, যা প্রোগ্রামটি একরকম নিখরচায় রাজত্ব পেয়ে যায়। প্রক্রিয়াটি (যখন আপনার বিন কার্যকর হওয়ার ফলস্বরূপ) শুরু করা হয় তখন স্ট্যাক মেমরিটি এখনও সিস্টেম দ্বারা বরাদ্দ করা হয়। প্রক্রিয়াটি তখন আপনার জন্য স্ট্যাক মেমরি পরিচালনা করে। যখন কোনও ফাংশন বা লুপ (যে কোনও ধরণের ব্লক) চালিত হয় / কার্যকর করা হয়, তখন block ব্লকের স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের দিকে ঠেলে দেওয়া হয় এবং সেগুলি মুছে ফেলা হয় ( কথা বলার জন্য স্ট্যাক মেমরিটি "মুক্ত হয় " ) অন্য দ্বারা ব্যবহার করার জন্য ফাংশন / ব্লক। তাই ঘোষণাint some_array[100]বিনটিতে কেবলমাত্র কয়েকটি বাইট অতিরিক্ত তথ্য যুক্ত করবে, এটি সিস্টেমে জানায় যে এক্স ক্রিয়াকলাপটির জন্য আরও 100*sizeof(int)কিছু বুক রাখার স্থান অতিরিক্ত লাগবে ।


অনেক ধন্যবাদ. আরও একটি প্রশ্ন, ফাংশনগুলির জন্য স্থানীয় ভেরিয়েবলগুলিও কি সংকলনের সময় একইভাবে বরাদ্দ পাওয়া যায়?
তালহা

@ তালাহায়েদ: হ্যাঁ, আমি এটাই বোঝাতে চাইছিলাম: "সিস্টেমটি যে ফাংশন / ব্লকটিতে কী পরিমাণ মেমরির প্রয়োজন হবে তা জানার জন্য সিস্টেমটির প্রয়োজনীয় তথ্য" " যে মুহুর্তে আপনি কোনও ফাংশন কল করবেন, সিস্টেমটি সেই ফাংশনের জন্য প্রয়োজনীয় মেমরি বরাদ্দ করবে। যে মুহুর্তে ফাংশনটি ফিরে আসবে, সেই স্মৃতি আবার মুক্তি পাবে।
এলিয়াস ভ্যান ওটেজেম

আপনার সি কোডের মতামতের জন্য: এটি আসলে / অগত্যা ঘটে তা হয় না। উদাহরণস্বরূপ, সংকলনের সময়ে সম্ভবত স্ট্রিংটি কেবলমাত্র একবার বরাদ্দ করা হবে। সুতরাং এটি কখনই "মুক্ত" হয় না (এছাড়াও আমি মনে করি যে সাধারণত আপনি যখন ডায়নামিকভাবে কিছু বরাদ্দ করেন তখন পরিভাষাটি ব্যবহৃত হয়), i"মুক্ত" বা হয় না। যদি iমেমোরিতে থাকতে হয় তবে এটি কেবল স্ট্যাকের দিকে ঠেলাঠেলি হয়ে যায়, এমন কিছু যা শব্দের সেই অর্থে মুক্তি পায় না, তা উপেক্ষা করে iবা cপুরো সময়টিকে রেজিস্টারে রাখা হবে। অবশ্যই, এটি সমস্ত সংকলকটির উপর নির্ভর করে, যার অর্থ এটি কালো এবং সাদা নয়।
ফ্যান্ট0 মি

@ ফ্যান্ট0 মি: আমি কখনও বলিনি স্ট্রাকে স্ট্রিং বরাদ্দ করা হয়েছে, কেবল পয়েন্টারটিও এটি হবে, স্ট্রিংটি কেবল পঠনযোগ্য মেমরিতে থাকবে in আমি জানি স্থানীয় ভেরিয়েবলের সাথে যুক্ত মেমরি free()কলগুলির অর্থে মুক্ত হয় না , তবে আমি যে ফাংশনটি রিটার্ন তালিকাভুক্ত করেছি তার পরে তারা ব্যবহৃত স্ট্যাক মেমরি অন্য ফাংশনগুলির দ্বারা ব্যবহারের জন্য বিনামূল্যে। আমি কোডটি সরিয়েছি, যেহেতু এটি
কারওর

আহ আমি দেখি. সেক্ষেত্রে আমার মন্তব্যটি বোঝাতে বলুন "আমি আপনার কথার দ্বারা বিভ্রান্ত হয়েছি"।
ফ্যান্ট0 মি

16

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

int a;
const int b[6] = {1,2,3,4,5,6};
char c[200];
const int d = 23;
int e[4] = {1,2,3,4};
int f;

এটি লিঙ্কারে বলবে যে এটির জন্য বিএসের জন্য 208 বাইট, "ডেটা" এর জন্য 16 বাইট এবং "কনস্টের" জন্য 28 বাইট দরকার। তদ্ব্যতীত, কোনও ভেরিয়েবলের কোনও রেফারেন্স অঞ্চল নির্বাচনকারী এবং অফসেটের সাথে প্রতিস্থাপন করা হবে, সুতরাং ক, বি, সি, ডি, এবং ই, বিএস + 0, কনস্ট + 0, বিএস + 4, কনস্ট + 24, ডেটা দ্বারা প্রতিস্থাপন করা হবে +0, বা বিএস + 204 যথাক্রমে।

যখন কোনও প্রোগ্রাম সংযুক্ত থাকে, সমস্ত মডিউল থেকে সমস্ত বিএস অঞ্চলগুলি একত্রে একত্রিত হয়; একইভাবে ডেটা এবং কনস্টের অঞ্চলগুলি। প্রতিটি মডিউলের জন্য, কোনও পূর্ববর্তী-সম্পর্কিত আপেক্ষিক ভেরিয়েবলের ঠিকানা পূর্ববর্তী সমস্ত মডিউলগুলির বস অঞ্চলগুলির (আবার, একইভাবে ডেটা এবং কনস্টের সাহায্যে) আকার দ্বারা বাড়ানো হবে। সুতরাং, লিঙ্কারটি সম্পন্ন করার পরে, কোনও প্রোগ্রামের জন্য একটি বিএসএস বরাদ্দ, একটি ডেটা বরাদ্দ এবং একটি কনট বরাদ্দ থাকবে।

যখন কোনও প্রোগ্রাম লোড হয়, চারটি জিনিসের একটি সাধারণত প্ল্যাটফর্মের উপর নির্ভর করে ঘটবে:

  1. এক্সিকিউটেবল ইঙ্গিত দেয় যে এটি প্রতিটি ধরণের ডেটার জন্য এবং কতগুলি বাইটের প্রয়োজন - প্রারম্ভিক ডেটা অঞ্চলের জন্য, যেখানে প্রাথমিক সামগ্রীগুলি পাওয়া যেতে পারে। এটিতে বিএসএস-, ডেটা-, বা কনস্ট্রেটিভ অ্যাড্রেস ব্যবহার করা সমস্ত নির্দেশাবলীর একটি তালিকাও অন্তর্ভুক্ত থাকবে। অপারেটিং সিস্টেম বা লোডার প্রতিটি অঞ্চলের জন্য যথাযথ পরিমাণ স্থান বরাদ্দ করবে এবং তারপরে প্রয়োজনীয় প্রতিটি নির্দেশিকায় সেই অঞ্চলের প্রারম্ভিক ঠিকানা যুক্ত করবে।

  2. অপারেটিং সিস্টেম তিনটি ধরণের ডেটা ধরে রাখতে মেমরির একটি অংশকে বরাদ্দ করবে এবং সেই অ্যাপ্লিকেশনটিকে মেমরির সেই অংশকে একটি পয়েন্টার দেবে। স্থিতিশীল বা গ্লোবাল ডেটা ব্যবহার করে এমন কোনও কোডই সেই পয়েন্টারের সাথে সম্পর্কিত হয়ে থাকে (অনেক ক্ষেত্রে পয়েন্টারটি আবেদনের আবেদনের জন্য একটি রেজিস্টারে সংরক্ষণ করা হবে)।

  3. অপারেটিং সিস্টেমটি প্রাথমিকভাবে অ্যাপ্লিকেশনটিতে কোনও মেমরি বরাদ্দ করে না, কেবল তার বাইনারি কোডটি ধারণ করেই, তবে অ্যাপ্লিকেশনটি প্রথম যেটি করে তা হ'ল অপারেটিং সিস্টেম থেকে উপযুক্ত বরাদ্দের অনুরোধ করা, যা এটি চিরকালের জন্য একটি রেজিস্টারে রাখবে।

  4. অপারেটিং সিস্টেম প্রাথমিকভাবে অ্যাপ্লিকেশনটির জন্য স্থান বরাদ্দ করবে না, তবে অ্যাপ্লিকেশন প্রারম্ভকালে (উপরে হিসাবে) একটি উপযুক্ত বরাদ্দের জন্য অনুরোধ করবে। অ্যাপ্লিকেশনটিতে ঠিকানাগুলির সহ নির্দেশাবলীর একটি তালিকা অন্তর্ভুক্ত থাকবে যেখানে মেমরিটি বরাদ্দ করা হয়েছিল (প্রথম শৈলীর মতো) প্রতিফলিত করার জন্য আপডেট করতে হবে, তবে ওএস লোডার দ্বারা অ্যাপ্লিকেশনটি প্যাচ করার পরিবর্তে অ্যাপ্লিকেশনটিতে প্যাচ দেওয়ার জন্য পর্যাপ্ত কোড অন্তর্ভুক্ত থাকবে ।

চারটি পদ্ধতিরই সুবিধা এবং অসুবিধা রয়েছে। তবে প্রতিটি ক্ষেত্রেই, সংকলক স্থির ভেরিয়েবলের একটি নির্বিচার সংখ্যক মেমরির অনুরোধগুলিতে সংশ্লেষ করবে এবং লিঙ্কারটি সেই সংক্ষিপ্ত সংখ্যক একীভূত বরাদ্দগুলিতে সংহত করবে। যদিও কোনও অ্যাপ্লিকেশনটিকে অপারেটিং সিস্টেম বা লোডার থেকে মেমরির একটি অংশ গ্রহণ করতে হবে, এটি সংকলক এবং লিঙ্কার যা এই বড় অংশ থেকে পৃথক টুকরোগুলিকে প্রয়োজনীয় সমস্ত পৃথক ভেরিয়েবলগুলিতে বরাদ্দ করার জন্য দায়ী।


13

আপনার প্রশ্নের মূলটি হ'ল: একটি কম্পাইল করা ফাইলটিতে "মেমরি কীভাবে" বরাদ্দ করা হয়? সমস্ত ভার্চুয়াল মেমরি পরিচালনার স্টাফ দিয়ে মেমরিটি কী সর্বদা র‍্যামে বরাদ্দ করা হয় না? সংজ্ঞা অনুসারে মেমরি বরাদ্দকরণ কি রানটাইম কনসেপ্ট নয়? "

আমি মনে করি সমস্যাটি হ'ল মেমরি বরাদ্দের সাথে জড়িত দুটি ভিন্ন ধারণা রয়েছে। এর মূল ভিত্তিতে, মেমরির বরাদ্দকরণ হ'ল প্রক্রিয়া যার মাধ্যমে আমরা বলি "এই আইটেমের এই আইটেমটি মেমরির এই নির্দিষ্ট অংশে সংরক্ষণ করা হয়"। একটি আধুনিক কম্পিউটার সিস্টেমে এটিতে একটি দুটি পদক্ষেপ প্রক্রিয়া জড়িত:

  • কিছু সিস্টেম ভার্চুয়াল ঠিকানায় আইটেমটি সংরক্ষণ করা হবে তা সিদ্ধান্ত নিতে ব্যবহৃত হয়
  • ভার্চুয়াল ঠিকানাটি একটি দৈহিক ঠিকানায় ম্যাপ করা হয়

পরবর্তী প্রক্রিয়াটি খাঁটিভাবে চালানোর সময়, তবে পূর্ববর্তীটি সংকলনের সময় করা যেতে পারে, যদি ডেটাগুলির একটি জ্ঞাত আকার থাকে এবং সেগুলির একটি নির্দিষ্ট সংখ্যার প্রয়োজন হয়। মূলত এটি কীভাবে কাজ করে তা এখানে:

  • সংকলকটি এমন একটি উত্স ফাইল দেখায় যা একটি লাইন ধারণ করে যা দেখতে কিছুটা এইরকম লাগে:

    int c;
  • এটি এসেম্বলারের পক্ষে আউটপুট তৈরি করে যা এটিকে ভেরিয়েবল 'সি' এর জন্য মেমরি সংরক্ষণ করতে নির্দেশ দেয়। এটি দেখতে এরকম দেখাচ্ছে:

    global _c
    section .bss
    _c: resb 4
    
  • যখন অ্যাসেমব্লার চালায়, এটি এমন একটি পাল্টা রাখে যা মেমরির 'বিভাগ' (বা 'বিভাগ') থেকে শুরু করে প্রতিটি আইটেমের অফসেটগুলি ট্র্যাক করে। এটি একটি খুব বড় 'স্ট্রাক্ট' এর অংশগুলির মতো যা পুরো ফাইলের সমস্ত কিছুতে এটিতে কোনও আসল মেমরি বরাদ্দ নেই এবং এটি যে কোনও জায়গায় হতে পারে। এটি একটি সারণীতে নোট করে যাতে একটি _cনির্দিষ্ট অফসেট রয়েছে (সেগমেন্টের শুরু থেকে 510 বাইট বলুন) এবং তারপরে তার পাল্টাটি 4 দ্বারা বাড়িয়েছে, সুতরাং পরবর্তী ধরণের ভেরিয়েবলটি (যেমন) 514 বাইটে হবে। যে কোনও কোডের ঠিকানা প্রয়োজন তার জন্য _cএটি কেবল আউটপুট ফাইলে 510 রাখে এবং একটি নোট যুক্ত করে যে আউটপুটটিতে সেগমেন্টের ঠিকানা প্রয়োজন যা এতে _cপরে যুক্ত করে contains

  • লিঙ্কার এসেম্বলারের সমস্ত আউটপুট ফাইল নেয় এবং সেগুলি পরীক্ষা করে। এটি প্রতিটি বিভাগের জন্য একটি ঠিকানা নির্ধারণ করে যাতে তারা ওভারল্যাপ না করে এবং প্রয়োজনীয় অফসেটগুলি যুক্ত করে যাতে নির্দেশাবলী এখনও সঠিক ডেটা আইটেমগুলিকে উল্লেখ করে। দখলদারীর মতো অবিচ্ছিন্ন মেমরির ক্ষেত্রেc(এসেমব্লারকে বলা হয়েছিল যে মেমরিটি একচেটিয়া হয়ে যাবে যে সংকলকটি এটি '.bss' বিভাগে রাখে, যা নামবিহীন মেমরির জন্য সংরক্ষিত একটি নাম), এটির আউটপুটে একটি শিরোলেখ ক্ষেত্র অন্তর্ভুক্ত যা অপারেটিং সিস্টেমকে বলে কতটা সংরক্ষণ করা দরকার needs এটি স্থানান্তরিত হতে পারে (এবং সাধারণত হয়) তবে সাধারণত একটি নির্দিষ্ট মেমরি ঠিকানায় আরও দক্ষতার সাথে লোড করার জন্য ডিজাইন করা হয়েছে এবং ওএস এ ঠিকানায় এটি লোড করার চেষ্টা করবে। এই মুহুর্তে, ভার্চুয়াল ঠিকানাটি কী ব্যবহার করবে তা আমাদের কাছে খুব ভাল ধারণা আছে c

  • প্রোগ্রামটি চলমান অবধি শারীরিক ঠিকানাটি নির্ধারিত হবে না। তবে প্রোগ্রামারের দৃষ্টিকোণ থেকে দৈহিক ঠিকানাটি আসলে অপ্রাসঙ্গিক it এটি কী তা আমরা কখনই খুঁজে পাব না কারণ ওএস সাধারণত কাউকে বলতে বিরক্ত করে না, এটি প্রায়শই পরিবর্তন করতে পারে (প্রোগ্রামটি চলাকালীন) এবং একটি ওএসের মূল উদ্দেশ্য এটিকে যেকোন উপায়ে বিমূর্ত করা।


9

একটি এক্সিকিউটেবল স্ট্যাটিক ভেরিয়েবলের জন্য কোন স্থান বরাদ্দ করতে হবে তা বর্ণনা করে। এই বরাদ্দটি সিস্টেম দ্বারা করা হয়, যখন আপনি এক্সিকিউটেবল চালাবেন। সুতরাং আপনার 1 কেবি স্ট্যাটিক ভেরিয়েবল 1 কেবি দিয়ে এক্সিকিউটেবলের আকার বাড়বে না:

static char[1024];

অবশ্যই আপনি প্রাথমিকের নির্দিষ্টকরণটি উল্লেখ না করে:

static char[1024] = { 1, 2, 3, 4, ... };

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


5

স্মৃতি বিভিন্নভাবে বরাদ্দ করা যেতে পারে:

  • অ্যাপ্লিকেশন হ্যাপে (প্রোগ্রামটি শুরু হওয়ার পরে ওএস দ্বারা আপনার অ্যাপের জন্য পুরো হিপ বরাদ্দ দেওয়া হয়)
  • অপারেটিং সিস্টেমের হিপগুলিতে (যাতে আপনি আরও বেশি করে দখল করতে পারেন)
  • আবর্জনা সংগ্রাহক নিয়ন্ত্রিত গাদা (উপরে উভয় হিসাবে একই)
  • স্ট্যাক (যাতে আপনি একটি স্ট্যাক ওভারফ্লো পেতে পারেন)
  • আপনার বাইনারি (এক্সিকিউটেবল) এর কোড / ডেটা বিভাগে সংরক্ষিত
  • দূরবর্তী জায়গায় (ফাইল, নেটওয়ার্ক - এবং আপনি সেই মেমরিটির কোনও পয়েন্টার নয় একটি হ্যান্ডেল পান)

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

তবে বেশিরভাগ ক্ষেত্রে ব্যক্তি কেবল বলতে চান যে পরিমাণ মেমরি বরাদ্দ করা হচ্ছে তা সংকলন সময়ে জানা গেছে

বাইনারি আকার কেবল তখনই পরিবর্তন হবে যখন আপনার অ্যাপ্লিকেশনটির কোড বা ডেটা বিভাগে মেমরিটি সংরক্ষিত থাকবে।


1
এই উত্তরটি বিভ্রান্তিমূলক (বা বিভ্রান্ত) এতে এটি "অ্যাপ্লিকেশন হিপ", "ওএস হিপ", এবং "জিসি হিপ" সম্পর্কে আলোচনা করেছে যেন এগুলি সমস্ত অর্থবহ ধারণা cep আমি অনুমান করি যে # 1 এর মাধ্যমে আপনি বলার চেষ্টা করেছিলেন যে কিছু প্রোগ্রামিং ভাষা সম্ভবত (অনুমানের) একটি "হিপ বরাদ্দ" স্কিম ব্যবহার করতে পারে যা ডেটা বিভাগে একটি নির্দিষ্ট আকারের বাফারের বাইরে মেমরি বরাদ্দ করে, তবে এটি ক্ষতিকারক হিসাবে যথেষ্ট অবাস্তব বলে মনে হচ্ছে ওপি এর বোঝাপড়া। পুনরায় # 2 এবং # 3, একজন জিসির উপস্থিতি সত্যিই কিছু পরিবর্তন করে না। এবং # 5 পুনরায়, আপনি মধ্যে অপেক্ষাকৃত অনেক বেশি গুরুত্বপূর্ণ পার্থক্য বাদ দেওয়া .dataএবং .bss
কুইকসপ্লসোন

4

তুমি ঠিক. মেমোরিটি আসলে লোডের সময় বরাদ্দ (পেজড) করা হয়, অর্থাৎ যখন এক্সিকিউটেবল ফাইলটি (ভার্চুয়াল) স্মৃতিতে আনা হয়। সেই মুহুর্তে স্মৃতিও শুরু করা যেতে পারে। সংকলক কেবল একটি মেমরি মানচিত্র তৈরি করে। [উপায় দ্বারা, স্ট্যাক এবং হিপ স্পেসগুলিও লোডের সময় বরাদ্দ করা হয়!]


2

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

সুতরাং, এর অর্থ এই যে সংকলকটি রানটাইমের সময় সেই মেমরিটি কোনওভাবে বরাদ্দ দেওয়ার জন্য নির্দেশাবলী উত্পন্ন করে। তবে আপনি যদি এটিকে ডান কোণ থেকে দেখেন তবে সংকলকটি সমস্ত নির্দেশ তৈরি করে, তাই পার্থক্য কী হতে পারে। পার্থক্যটি হ'ল সংকলক সিদ্ধান্ত নেয় এবং রানটাইমের সময় আপনার কোডটি তার সিদ্ধান্তগুলি পরিবর্তন বা পরিবর্তন করতে পারে না। যদি এটি সিদ্ধান্ত নিয়েছে যে রানটাইমের সময় এটির জন্য 50 বাইটের প্রয়োজন, আপনি 60 টি বরাদ্দের সিদ্ধান্ত নিতে পারবেন না - সিদ্ধান্ত ইতিমধ্যে নেওয়া হয়েছে।


আমি উত্তরগুলি পছন্দ করি যা সক্রেটিক পদ্ধতি ব্যবহার করে, তবে আমি আপনাকে এখনও সেই ভুল উপসংহারের জন্য অগ্রাহ্য করেছি যে "সংকলকটি রানটাইমের সময় কোনওভাবে সেই মেমরিটি বরাদ্দ দেওয়ার জন্য নির্দেশনা উত্পন্ন করে"। কোনও রানটাইম "নির্দেশাবলী" তৈরি না করে কোনও সংকলক কীভাবে "মেমরি বরাদ্দ করতে পারে" তা দেখতে শীর্ষ-ভোট দেওয়া উত্তরটি দেখুন। (দ্রষ্টব্য যে কোনও সমাবেশ-ভাষা প্রসঙ্গে "নির্দেশাবলীর" একটি নির্দিষ্ট অর্থ রয়েছে, অর্থাত্ এক্সিকিউটেবল ওপকোডস col আপনি সম্ভবত "কথার রেসিপি" এর মতো কিছু বোঝাতে কথোপকথন শব্দটি ব্যবহার করেছেন, তবে এই প্রসঙ্গে আপনি কেবল ওপিকে বিভ্রান্ত করবেন। )
কুইকপ্লসোন

1
@ কিউকপ্লসোন: আমি উত্তরটি পড়েছি (এবং উন্নত) করেছি। এবং না, আমার উত্তরটি প্রাথমিকভাবে ভেরিয়েবলগুলির ইস্যুটি নির্দিষ্ট করে না। এটি স্ব-সংশোধনকারী কোডকেও সম্বোধন করে না। যদিও উত্তরটি দুর্দান্ত, তবে আমি কোন গুরুত্বপূর্ণ বিষয়টিকে বিবেচনা করি - এটি বিষয়গুলিকে প্রসঙ্গে রাখে address সুতরাং আমার উত্তর, যা আমি আশা করি ওপি (এবং অন্যান্য) কে থামাতে এবং কী চলছে বা কী হতে পারে সে সম্পর্কে ভাবতে সহায়তা করবে, যখন তাদের সমস্যা রয়েছে যখন তারা বুঝতে পারে না।
jmoreno

@ কিউকপ্লসোন: দুঃখিত যদি আমি এখানে মিথ্যা অভিযোগ তুলছি তবে আমি তা গ্রহণ করি যে আপনিও আমার উত্তরটি -1'-এর লোকদের মধ্যে একজন ছিলেন। যদি তা হয় তবে আপনি কি জবাব দিয়ে আমার উত্তরের কোন অংশটি প্রধান কারণ বলে মনে করবেন এবং আপনি কি আমার সম্পাদনা পরীক্ষা করে দেখবেন? আমি জানি যে স্ট্যাক মেমরিটি কীভাবে পরিচালিত হয় তার সত্যিকারের অভ্যন্তরীণ সম্পর্কে আমি কিছু বিট এড়িয়ে গেছি, সুতরাং আমি এখনই আমার উত্তরের 100% সঠিক না হওয়া সম্পর্কে কিছুটা যুক্ত করেছি :)
এলিয়াস ভ্যান ওটেজেম

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

2

আপনি যদি অ্যাসেম্বলি প্রোগ্রামিং শিখেন তবে আপনি দেখতে পাবেন যে আপনাকে ডেটা, স্ট্যাক এবং কোড ইত্যাদির জন্য অংশগুলি তৈরি করতে হবে ডেটা বিভাগটি যেখানে আপনার স্ট্রিং এবং সংখ্যাগুলি থাকে। কোড বিভাগটি যেখানে আপনার কোড থাকে। এই বিভাগগুলি এক্সিকিউটেবল প্রোগ্রামে অন্তর্নির্মিত। অবশ্যই স্ট্যাকের আকারটিও গুরুত্বপূর্ণ ... আপনি একটি স্ট্যাকের ওভারফ্লো চাইবেন না !

সুতরাং যদি আপনার ডেটা বিভাগটি 500 বাইট হয় তবে আপনার প্রোগ্রামটির 500 বাইট অঞ্চল রয়েছে। আপনি যদি ডেটা বিভাগটি 1500 বাইটে পরিবর্তন করেন তবে প্রোগ্রামের আকারটি 1000 বাইট বেশি হবে। তথ্যগুলি আসল প্রোগ্রামে একত্রিত হয়।

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


2

আমি কয়েকটি চিত্রের সাহায্যে এই ধারণাগুলি ব্যাখ্যা করতে চাই।

এটি সত্য যে মেমরিটি সংকলনের সময় বরাদ্দ করা যায় না, অবশ্যই। তবে, সংকলন সময়ে আসলে কী ঘটে।

এখানে ব্যাখ্যা আসে। বলুন, উদাহরণস্বরূপ একটি প্রোগ্রামে চারটি ভেরিয়েবল x, y, z এবং k রয়েছে। এখন, সংকলনের সময় এটি কেবল একটি স্মৃতি মানচিত্র তৈরি করে, যেখানে একে অপরের সাথে সম্মানযুক্ত এই ভেরিয়েবলগুলির অবস্থান নির্ধারণ করা হয়। এই চিত্রটি আরও ভালভাবে চিত্রিত করবে।

এখন কল্পনা করুন, কোনও প্রোগ্রাম মেমোরিতে চলছে না। এটি আমি একটি বড় ফাঁকা আয়তক্ষেত্র দিয়ে দেখাব।

খালি মাঠ

এর পরে, এই প্রোগ্রামটির প্রথম উদাহরণটি কার্যকর করা হয়। আপনি নিম্নলিখিত হিসাবে এটি কল্পনা করতে পারেন। এটি সেই সময় যখন আসলে স্মৃতি বরাদ্দ করা হয়।

প্রথমত

এই প্রোগ্রামের দ্বিতীয় উদাহরণটি চলমান থাকলে, মেমরিটি নীচের মতো দেখতে হবে।

দ্বিতীয় উদাহরণ

এবং তৃতীয় ..

তৃতীয় উদাহরণ

তাই এবং তাই ঘোষণা.

আমি আশা করি এই দৃশ্যটি এই ধারণাটি ভালভাবে ব্যাখ্যা করেছে।


2
যদি এই চিত্রগুলি স্থির এবং গতিশীল মেমরির মধ্যে পার্থক্য দেখায় তবে তারা আইএমএইচও আরও কার্যকর হবে।
বারটেক বানাচেউইচজ

বিষয়গুলি সরল রাখার জন্য এটি আমার দ্বারা ইচ্ছাকৃতভাবে এড়ানো হয়েছিল। আমার ফোকাস হ'ল এই ফান্ডাকে অনেক প্রযুক্তিগত বিশৃঙ্খলা ছাড়াই স্পষ্টতার সাথে ব্যাখ্যা করা। যতদূর এটি স্ট্যাটিক ভেরিয়েবলের জন্য বোঝানো হয়েছে .. এই উত্তরটি পূর্ববর্তী উত্তরগুলির দ্বারা ভালভাবে প্রতিষ্ঠিত হয়েছে o সুতরাং আমি এড়িয়ে গেছি।
ব্যবহারকারী3258051

1
হ্যাঁ, এই ধারণাটি বিশেষ জটিল নয়, তাই কেন এটি হওয়া দরকার তার চেয়ে সহজতর করার জন্য আমি দেখতে পাচ্ছি না, তবে এটি কেবল প্রশংসামূলক উত্তর হিসাবে বোঝানো হয়েছে, ঠিক আছে।
বারটেক বানাচেউইচজ

1

গৃহীত উত্তরে খুব সুন্দর ব্যাখ্যা দেওয়া আছে। কেবলমাত্র আমি লিঙ্কটি পোস্ট করব যা আমি দরকারী বলে মনে করি। https://www.tenouk.com/ModuleW.html

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