সি মেমরি বরাদ্দ ফাংশনগুলির বেশিরভাগ বাস্তবায়ন প্রতিটি ব্লকের জন্য অ্যাকাউন্টের তথ্য ইন-লাইন বা পৃথকভাবে সঞ্চয় করবে।
একটি সাধারণ উপায় (ইন-লাইন) হ'ল শিরোনাম এবং মেমরির জন্য আপনি যে ন্যূনতম আকারে প্যাড করেছেন তা উভয়ই বরাদ্দ করা। সুতরাং উদাহরণস্বরূপ, আপনি যদি 20 বাইট চেয়েছিলেন, সিস্টেমটি 48-বাইট ব্লক বরাদ্দ করতে পারে:
- আকার, বিশেষ চিহ্নিতকারী, চেকসাম, পরবর্তী / পূর্ববর্তী ব্লকের পয়েন্টার এবং এগুলি সহ 16 বাইট শিরোনাম
- 32 বাইট ডেটা আয়তন (আপনার 20 বাইট 16 এর একাধিকতে প্যাড করেছে)।
তারপরে আপনাকে যে ঠিকানাটি দেওয়া হবে তা হ'ল ডেটা এলাকার ঠিকানা। তারপরে, আপনি যখন ব্লকটি মুক্ত free
করবেন, কেবলমাত্র আপনি যে ঠিকানাটি দিয়েছেন তা গ্রহণ করবেন এবং ধরে নিবেন যে আপনি সেই ঠিকানাটি বা তার চারপাশের স্মৃতিটি পূরণ করেন নি, অ্যাকাউন্টিংয়ের তথ্য ঠিক এর আগেই পরীক্ষা করে নিন। গ্রাফিকালি, এটি লাইন বরাবর হবে:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
শিরোনামের আকার এবং প্যাডিং পুরোপুরি বাস্তবায়ন সংজ্ঞায়িত করা মনে রাখবেন (আসলে, পুরো জিনিসটি বাস্তবায়ন-সংজ্ঞায়িত (ক) তবে ইন-লাইন অ্যাকাউন্টিং বিকল্পটি একটি সাধারণ)।
অ্যাকাউন্টিংয়ের তথ্যে উপস্থিত চেকসাম এবং বিশেষ চিহ্নিতকারীগুলি প্রায়শই "মেমরির ক্ষেত্রের ক্ষতিগ্রস্থ" বা "ডাবল ফ্রি" এর মতো ত্রুটির কারণ হয়ে থাকে যদি আপনি সেগুলি ওভাররাইট করে থাকেন বা দুবার মুক্ত করেন।
প্যাডিং (বরাদ্দকে আরও দক্ষ করার জন্য) আপনি মাঝে মাঝে সমস্যা তৈরি না করে আপনার অনুরোধ করা জায়গার শেষের বাইরে কিছুটা লিখতে পারেন (এখনও, এটি করবেন না, এটি অনির্ধারিত আচরণ এবং কারণ এটি কখনও কখনও কাজ করে না, ' t এর অর্থ এটি করা ঠিক আছে)।
(ক)malloc
এম্বেড থাকা সিস্টেমগুলিতে আমি প্রয়োগগুলি লিখেছি যেখানে আপনি যা চেয়েছিলেন 128 বাইট পেয়েছেন (এটি সিস্টেমের বৃহত্তম কাঠামোর আকার ছিল) আপনি 128 বাইট বা তার চেয়ে কম চেয়েছিলেন (ধরে নিলে আরও অনুরোধ হবে) একটি নাল ফেরতের মান পূরণ করা হবে)। একটি খুব সাধারণ বিট-মাস্ক (অর্থাত্ ইন-লাইন নয়) একটি 128-বাইট অংশ বরাদ্দ ছিল কিনা তা নির্ধারণের জন্য ব্যবহৃত হয়েছিল।
অন্যরা যেগুলির বিকাশ করেছি তাদের মধ্যে 16-বাইট খণ্ড, 64-বাইট খণ্ড, 256-বাইট খণ্ড এবং 1 কে খণ্ডগুলির জন্য আলাদা পুল রয়েছে, আবার কী কী ব্লক ব্যবহার করা হয়েছে বা উপলভ্য তা স্থির করতে বিট-মাস্ক ব্যবহার করে।
এই দুটি বিকল্পই অ্যাকাউন্টিং তথ্যের ওভারহেড হ্রাস করতে এবং এর গতি বাড়াতে malloc
এবং free
(মুক্ত করার সময় সংলগ্ন ব্লকগুলিকে একত্রিত করার দরকার নেই) পরিচালিত হয়েছিল, বিশেষত আমরা যে পরিবেশে কাজ করছিলাম সে ক্ষেত্রে এটি গুরুত্বপূর্ণ।