আমি জানতে চাই স্থিতিশীল মেমরি বরাদ্দ এবং গতিশীল মেমরি বরাদ্দ মধ্যে পার্থক্য কি?
আপনি কোন উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন?
আমি জানতে চাই স্থিতিশীল মেমরি বরাদ্দ এবং গতিশীল মেমরি বরাদ্দ মধ্যে পার্থক্য কি?
আপনি কোন উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন?
উত্তর:
স্থির, স্বয়ংক্রিয় এবং গতিশীল - তিনটি বরাদ্দ রয়েছে।
স্ট্যাটিক বরাদ্দের অর্থ, প্রোগ্রামটি শুরু হওয়ার পরে আপনার ভেরিয়েবলের জন্য মেমরি বরাদ্দ দেওয়া হয়। প্রোগ্রামটি তৈরি হয়ে গেলে আকারটি স্থির করা হয়। এটি গ্লোবাল ভেরিয়েবল, ফাইল স্কোপ ভেরিয়েবল এবং ভেরিয়েবলগুলিতে 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);
এটি একটি স্ট্যান্ডার্ড সাক্ষাত্কার প্রশ্ন:
রানওয়ার সময় মেমরি বরাদ্দ করা হয় 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. */
বেশিরভাগ আধুনিক সংকলকগুলি চয়ন করার সময় আপনার চেয়ে বেশি স্মার্ট হয় যা কোন ভেরিয়েবলগুলিকে রেজিস্টারে রাখতে হবে :)
int * a = malloc(sizeof(*a));
পরিবর্তে পরামর্শ দেব , যাতে এর ধরণের পুনরাবৃত্তি এড়াতে a
। এটি a
পরিবর্তনের ধরণে জিনিসগুলি আরও সহজ করে তোলে ।
স্থির মেমরি বরাদ্দ:
গতিশীল মেমরি বরাদ্দ:
স্থির মেমরি বরাদ্দ: সংকলকটি ঘোষিত ভেরিয়েবলের জন্য প্রয়োজনীয় মেমরি স্থান বরাদ্দ করে operator অপারেটরের ঠিকানা ব্যবহার করে, সংরক্ষিত ঠিকানাটি পাওয়া যায় এবং এই ঠিকানাটি একটি পয়েন্টার ভেরিয়েবলের জন্য বরাদ্দ করা হতে পারে S তবে বেশিরভাগ ঘোষিত ভেরিয়েবলের স্থির মেমরি থাকে, এটি পয়েন্টার ভেরিয়েবলকে পয়েন্টার মান নির্ধারণের উপায়টি স্ট্যাটিক মেমরি বরাদ্দ হিসাবে পরিচিত। সংকলনের সময় স্মৃতি নির্ধারিত হয়।
ডায়নামিক মেমোরি বরাদ্দ: এটি গতিশীলভাবে মেমরি পাওয়ার জন্য malloc () বা কলোক () এর মতো ফাংশন ব্যবহার করে these যদি এই ফাংশনগুলি মেমরিটি গতিশীলভাবে পেতে ব্যবহার করা হয় এবং এই ফাংশনগুলি দ্বারা প্রাপ্ত মানগুলি পয়েন্টার ভেরিয়েবলগুলিতে অর্পণ করা হয়, যেমন অ্যাসাইনমেন্টগুলি গতিশীল মেমরি হিসাবে পরিচিত are বরাদ্দ.মেমরি রান সময় চলাকালীন দেওয়া হয়।
মধ্যে পার্থক্য স্ট্যাটিক মেমরি অ্যালোকেশন & ডাইনামিক মেমরি অ্যালোকেশন
প্রোগ্রামটি কার্যকর হওয়ার আগে মেমরি বরাদ্দ করা হয় (সংকলনের সময়)।
প্রোগ্রামটি কার্যকর করার সময় স্মৃতি বরাদ্দ করা হয়।
এক্সিকিউশন চলাকালীন কোনও মেমরি বরাদ্দ বা ডিএলোকেশন ক্রিয়া সম্পাদিত হয় না।
এক্সিকিউশন চলাকালীন মেমরি বাইন্ডিংগুলি প্রতিষ্ঠিত হয় এবং ধ্বংস হয়।
চলকগুলি স্থায়ীভাবে বরাদ্দ থাকে।
প্রোগ্রাম ইউনিট সক্রিয় থাকাকালীনই বরাদ্দ।
স্ট্যাক এবং হিপ ব্যবহার করে প্রয়োগ করা হয়েছে।
ডেটা বিভাগগুলি ব্যবহার করে কার্যকর করা হয়েছে।
ভেরিয়েবল অ্যাক্সেস করার জন্য পয়েন্টার প্রয়োজন।
গতিশীল বরাদ্দ পয়েন্টার প্রয়োজন নেই।
ডায়নামিকের চেয়ে দ্রুত কার্যকরকরণ।
স্থির চেয়ে ধীর সম্পাদন execution
আরও মেমরি স্পেস প্রয়োজন।
কম স্মৃতির স্থান প্রয়োজন।
সংকলনের সময় এক্সিকিউশন পিএফ প্রোগ্রামের আগে স্থিতিশীল মেমরি বরাদ্দ করা হয় memory গতিশীল মেমরি আলোকেশন রান সময় সময় প্রোগ্রাম সঞ্চালনের সময় মেমোরি alocated হয়।