স্থির মেমরি বরাদ্দ এবং গতিশীল মেমরি বরাদ্দ মধ্যে পার্থক্য


100

আমি জানতে চাই স্থিতিশীল মেমরি বরাদ্দ এবং গতিশীল মেমরি বরাদ্দ মধ্যে পার্থক্য কি?

আপনি কোন উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন?

উত্তর:


98

স্থির, স্বয়ংক্রিয় এবং গতিশীল - তিনটি বরাদ্দ রয়েছে।

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

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

void func() {
    int i; /* `i` only exists during `func` */
}

গতিশীল মেমরি বরাদ্দ কিছুটা আলাদা। আপনি এখন এই মেমরির অবস্থানগুলির সঠিক আকার এবং জীবনকাল নিয়ন্ত্রণ করতে পারেন। যদি আপনি এটি মুক্ত না করেন তবে আপনি মেমরি ফাঁস হয়ে যাবেন যা আপনার অ্যাপ্লিকেশনটিকে ক্রাশের কারণ হতে পারে, কারণ কোনও এক সময় সিস্টেম আরও মেমরি বরাদ্দ করতে পারে না।

int* func() {
    int* mem = malloc(1024);
    return mem;
}

int* mem = func(); /* still accessible */

উপরের উদাহরণে, বরাদ্দ হওয়া মেমরিটি এখনও কার্যকর এবং অ্যাক্সেসযোগ্য, যদিও ফাংশনটি সমাপ্ত হয়। আপনি যখন মেমরিটি সম্পন্ন করেন, আপনাকে এটিকে মুক্ত করতে হবে:

free(mem);

4
অবশ্যই আপনার চলকগুলির আজীবন নিয়ন্ত্রণ থাকবে ... আপনিই সুযোগটি ঠিক করছেন?
লুচিয়ান গ্রিগোর

অবশ্যই, তবে এটি আমি বোঝাতে চাইনি। ভেরিয়েবলের আধিপত্য বহির্গমন করতে আপনি আজীবন প্রসারিত করতে পারবেন না। তবে আমার উত্তরটিতে আমার তা পরিষ্কার করা উচিত। ধন্যবাদ
কনস্টান্টিনিয়াস

4
-1 এই উত্তরটি ভুল। আপনি স্থির এবং স্বয়ংক্রিয় ভেরিয়েবল গুলিয়ে ফেলেন
Brice

4
আপনার নিজস্ব বাক্যটি পড়ে: " স্ট্যাটিক বরাদ্দের অর্থ, আপনার ভেরিয়েবলগুলির জন্য মেমরিটি স্বয়ংক্রিয়ভাবে বরাদ্দ হয়ে যায়" এটি ভুলজিএনইউর লাইবসিটির জন্য ম্যানুয়াল পৃষ্ঠাটি কী বলবে তা একবার দেখুন।
brice

4
@ এলিবেেন্ডারস্কি এটি এখন পুনরায় সংশোধন করা হয়েছে। এখনই ঠিক আছে কিনা তা পরীক্ষা করে দেখুন।
সুরজ জৈন

120

এটি একটি স্ট্যান্ডার্ড সাক্ষাত্কার প্রশ্ন:

গতিশীল মেমরি বরাদ্দ

রানওয়ার সময় মেমরি বরাদ্দ করা হয় calloc(), malloc()এবং বন্ধুরা। এটি কখনও কখনও 'হিপ' মেমরি হিসাবেও পরিচিত, যদিও হিপ ডেটা-স্ট্রাকচার রেফের সাথে এর কোনও যোগসূত্র নেই

int * a = malloc(sizeof(int));

কল না হওয়া পর্যন্ত হিপ মেমরি অবিচল থাকে free()। অন্য কথায়, আপনি চলকটির জীবনকাল নিয়ন্ত্রণ করেন।

স্বয়ংক্রিয় মেমরি বরাদ্দ

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

int a = 43;

নোট করুন যে সুযোগটি অগত্যা ফাংশন বোঝায় না। স্কোপগুলি কোনও ফাংশনের মধ্যে বাসা বাঁধতে পারে এবং ভেরিয়েবলটি কেবলমাত্র যে ব্লকটিতে এটি ঘোষিত হয়েছিল তার মধ্যেই স্কোপগুলি স্কোপ হবে। এই মেমরিটি বরাদ্দ করা হয়েছে যেখানে নির্দিষ্ট করা হয়নি তাও নোট করুন। (একটি বুদ্ধিমান সিস্টেমে এটি স্ট্যাকের উপরে থাকবে বা অপ্টিমাইজেশনের জন্য নিবন্ধভুক্ত হবে)

স্থির মেমরি বরাদ্দ

সংকলন সময় বরাদ্দ করা হয় * , এবং স্থির মেমরি একটি পরিবর্তনশীল এর জীবনকাল প্রোগ্রামের জীবনকাল

সি তে, স্ট্যাটিক মেমরিটি staticকীওয়ার্ড ব্যবহার করে বরাদ্দ করা যেতে পারে । সুযোগটি কেবল সংকলনের একক।

কীওয়ার্ড বিবেচনা করা হলেextern বিষয়গুলি আরও আকর্ষণীয় হয় । যখন কোনও externভেরিয়েবল সংজ্ঞায়িত করা হয় তখন সংকলক এর জন্য মেমরি বরাদ্দ করে। যখন কোনও externভেরিয়েবল ঘোষিত হয় , সংকলকটির প্রয়োজন হয় যে ভেরিয়েবলটি অন্য কোথাও সংজ্ঞায়িত করা উচিতexternভেরিয়েবলগুলি ঘোষিত / সংজ্ঞায়িত করতে ব্যর্থতা লিঙ্কিংয়ের সমস্যা সৃষ্টি করবে, যখন staticভেরিয়েবলগুলি ঘোষণা / সংজ্ঞা দিতে ব্যর্থতা সংকলনের সমস্যা সৃষ্টি করবে।

ফাইল স্কোপে স্থির কীওয়ার্ডটি alচ্ছিক (কোনও ফাংশনের বাইরে):

int a = 32;

তবে ফাংশনের সুযোগে নয় (কোনও কার্যের অভ্যন্তরে):

static int a = 32;

প্রযুক্তিগতভাবে, externএবং staticসি তে দুটি পৃথক শ্রেণি রয়েছে vari

extern int a; /* Declaration */
int a; /* Definition */

* স্ট্যাটিক মেমরি অ্যালোকেশন নোটগুলি

এটি কিছুটা বিভ্রান্ত করে বলা যায় যে সংকলনের সময় স্থির মেমরি বরাদ্দ করা হয়, বিশেষত আমরা যদি বিবেচনা করা শুরু করি যে সংকলন মেশিন এবং হোস্ট মেশিনটি একই নাও হতে পারে বা একই স্থাপত্যে নাও থাকতে পারে।

মনে করা ভাল যে স্থির মেমরির বরাদ্দটি সংকলন সময়ে বরাদ্দ না করে সংকলক দ্বারা পরিচালনা করা হয়

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

মেমোরি নিবন্ধন করুন

শেষ মেমরি ক্লাস হ'ল 'রেজিস্টার' ভেরিয়েবল। প্রত্যাশিত হিসাবে, রেজিস্টার ভেরিয়েবলগুলি সিপিইউ'র রেজিস্টারে বরাদ্দ করা উচিত, তবে সিদ্ধান্তটি আসলে সংকলকটির কাছে রেখে দেওয়া হয়েছে। আপনি ঠিকানা-ঠিকানা ব্যবহার করে কোনও রেজিস্টার ভেরিয়েবলটিকে রেফারেন্সে রূপান্তর করতে পারবেন না।

register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */

বেশিরভাগ আধুনিক সংকলকগুলি চয়ন করার সময় আপনার চেয়ে বেশি স্মার্ট হয় যা কোন ভেরিয়েবলগুলিকে রেজিস্টারে রাখতে হবে :)

তথ্যসূত্র:


4
দ্রষ্টব্য: আমি এর int * a = malloc(sizeof(*a));পরিবর্তে পরামর্শ দেব , যাতে এর ধরণের পুনরাবৃত্তি এড়াতে a। এটি aপরিবর্তনের ধরণে জিনিসগুলি আরও সহজ করে তোলে ।
শাহবাজ

4
একিউটালি একে হিপ বলা হয় তবে হিপ ডেটা স্ট্রাকচারের সাথে এর কোনও যোগসূত্র নেই। এই ক্ষেত্রে গাদা অর্থ একটি অগোছালো জায়গা
গতিশীল

4
"স্থিতিশীল মেমরি বরাদ্দ ... সংকলন সময়ে বরাদ্দ করা হয়" আপনি কি অর্থ বরাদ্দ আকার সংকলন সময়ে নির্ধারিত হয়? কেবল রানটাইমের সময় স্মৃতি আলাদা করে রাখা হবে না?
lf215

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

4
@ লোকালহোস্ট অটোমেটিক ভেরিয়েবলগুলি প্রাসঙ্গিক (কোঁকড়ানো ধনুর্বন্ধনী) এর আজীবন স্কোপ করা হয় যেখানে সেগুলি সংজ্ঞায়িত করা হয়েছে। এটি সাধারণত রানটাইমের সময় কল স্ট্যাকের বরাদ্দ। এটি অবশ্যই ডেটা বিভাগে সঞ্চিত নয় । আপনি এখানে সি 18 স্ট্যান্ডার্ডটি পড়তে পারেন: (6.2.4.5-7) web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/…
brice

3

স্থির মেমরি বরাদ্দ:

  • চলকগুলি স্থায়ীভাবে বরাদ্দ পাওয়া যায়
  • প্রোগ্রাম কার্যকর করার আগে বরাদ্দ দেওয়া হয়
  • এটি স্ট্যাটিক বরাদ্দ বাস্তবায়নের জন্য স্ট্যাক নামক ডেটা স্ট্রাকচার ব্যবহার করে
  • কম দক্ষ
  • নেই কোন মেমরি পুনর্ব্যাবহার্যোগ্যতা

গতিশীল মেমরি বরাদ্দ:

  • প্রোগ্রাম ইউনিট সক্রিয় হয়ে উঠলে কেবল ভেরিয়েবলগুলি বরাদ্দ পাওয়া যায়
  • প্রোগ্রাম নির্বাহের সময় বরাদ্দ দেওয়া হয়
  • এটি গতিশীল বরাদ্দ বাস্তবায়নের জন্য হ্যাপ নামক ডেটা স্ট্রাকচার ব্যবহার করে
  • আরো দক্ষ
  • নেই মেমরির পুনর্ব্যাবহার্যোগ্যতা । প্রয়োজন না হলে স্মৃতি মুক্ত করা যায়

4
"স্ট্যাটিক মেমরি বরাদ্দ [...] এটি স্ট্যাটিক বরাদ্দ বাস্তবায়নের জন্য স্ট্যাক নামক ডেটা স্ট্রাকচার ব্যবহার করে" না , এটি ভুল এবং বিভ্রান্তিকর। স্বয়ংক্রিয় এবং স্থির বরাদ্দের মধ্যে পার্থক্যের জন্য দয়া করে আমার পোস্টটি দেখুন। স্থির মেমরি স্ট্যাক ব্যবহার করতে পারে। এটি দৃ strongly়ভাবে বাস্তবায়ন নির্ভর, এবং একই বাস্তবায়নের জন্য একাধিক কৌশল ব্যবহার করা যেতে পারে। আপনি "কম দক্ষ" দ্বারা কী বোঝাতে চাইছেন তা নিশ্চিত নই। @ ট্রিউউ তোয়ান, আপনি একটি খারাপ সম্পাদনা করে এই উত্তরের অর্থ পরিবর্তন করেছেন।
brice 15 ই

2

স্থির মেমরি বরাদ্দ: সংকলকটি ঘোষিত ভেরিয়েবলের জন্য প্রয়োজনীয় মেমরি স্থান বরাদ্দ করে operator অপারেটরের ঠিকানা ব্যবহার করে, সংরক্ষিত ঠিকানাটি পাওয়া যায় এবং এই ঠিকানাটি একটি পয়েন্টার ভেরিয়েবলের জন্য বরাদ্দ করা হতে পারে S তবে বেশিরভাগ ঘোষিত ভেরিয়েবলের স্থির মেমরি থাকে, এটি পয়েন্টার ভেরিয়েবলকে পয়েন্টার মান নির্ধারণের উপায়টি স্ট্যাটিক মেমরি বরাদ্দ হিসাবে পরিচিত। সংকলনের সময় স্মৃতি নির্ধারিত হয়।

ডায়নামিক মেমোরি বরাদ্দ: এটি গতিশীলভাবে মেমরি পাওয়ার জন্য malloc () বা কলোক () এর মতো ফাংশন ব্যবহার করে these যদি এই ফাংশনগুলি মেমরিটি গতিশীলভাবে পেতে ব্যবহার করা হয় এবং এই ফাংশনগুলি দ্বারা প্রাপ্ত মানগুলি পয়েন্টার ভেরিয়েবলগুলিতে অর্পণ করা হয়, যেমন অ্যাসাইনমেন্টগুলি গতিশীল মেমরি হিসাবে পরিচিত are বরাদ্দ.মেমরি রান সময় চলাকালীন দেওয়া হয়।


1

মধ্যে পার্থক্য স্ট্যাটিক মেমরি অ্যালোকেশন & ডাইনামিক মেমরি অ্যালোকেশন

প্রোগ্রামটি কার্যকর হওয়ার আগে মেমরি বরাদ্দ করা হয় (সংকলনের সময়)।
প্রোগ্রামটি কার্যকর করার সময় স্মৃতি বরাদ্দ করা হয়।

এক্সিকিউশন চলাকালীন কোনও মেমরি বরাদ্দ বা ডিএলোকেশন ক্রিয়া সম্পাদিত হয় না।
এক্সিকিউশন চলাকালীন মেমরি বাইন্ডিংগুলি প্রতিষ্ঠিত হয় এবং ধ্বংস হয়।

চলকগুলি স্থায়ীভাবে বরাদ্দ থাকে।
প্রোগ্রাম ইউনিট সক্রিয় থাকাকালীনই বরাদ্দ।

স্ট্যাক এবং হিপ ব্যবহার করে প্রয়োগ করা হয়েছে।
ডেটা বিভাগগুলি ব্যবহার করে কার্যকর করা হয়েছে।

ভেরিয়েবল অ্যাক্সেস করার জন্য পয়েন্টার প্রয়োজন।
গতিশীল বরাদ্দ পয়েন্টার প্রয়োজন নেই।

ডায়নামিকের চেয়ে দ্রুত কার্যকরকরণ।
স্থির চেয়ে ধীর সম্পাদন execution

আরও মেমরি স্পেস প্রয়োজন।
কম স্মৃতির স্থান প্রয়োজন।


4
স্থির মেমরি বরাদ্দ স্ট্যাকের উপর বরাদ্দ করা হয় এবং গতিবেগের উপর গতিশীল মেমরি বরাদ্দ
উসমান কুর্দু

@ উসমানকুর্ড স্থায়ী মেমরির ক্ষেত্রে এটি সাধারণত ভুল। আমার উত্তর দেখুন।
উজ্জ্বল

0

সংকলনের সময় এক্সিকিউশন পিএফ প্রোগ্রামের আগে স্থিতিশীল মেমরি বরাদ্দ করা হয় memory গতিশীল মেমরি আলোকেশন রান সময় সময় প্রোগ্রাম সঞ্চালনের সময় মেমোরি alocated হয়।


-1

স্থির মেমরি বরাদ্দ। বরাদ্দ মেমরি স্ট্যাক হবে।

int a[10];

গতিশীল মেমরি বরাদ্দ। বরাদ্দ মেমরি গাদা হবে।

int *a = malloc(sizeof(int) * 10);

এবং পরবর্তীটি বিনামূল্যে ডি হওয়া উচিত কারণ সিতে কোনও আবর্জনা সংগ্রাহক (জিসি) নেই since

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