सी मेमोरी आवंटन कार्यों के अधिकांश कार्यान्वयन प्रत्येक ब्लॉक के लिए या तो इन-लाइन या अलग से लेखांकन जानकारी संग्रहीत करेंगे।
एक विशिष्ट तरीका (इन-लाइन) वास्तव में एक हेडर और आपके द्वारा मांगी गई मेमोरी दोनों को आवंटित करना है, कुछ न्यूनतम आकार के लिए गद्देदार। उदाहरण के लिए, यदि आपने 20 बाइट्स मांगे हैं, तो सिस्टम 48-बाइट ब्लॉक आवंटित कर सकता है:
- 16-बाइट हेडर जिसमें आकार, विशेष मार्कर, चेकसम, अगले / पिछले ब्लॉक और इतने पर पॉइंटर्स हैं।
- 32 बाइट्स डेटा क्षेत्र (आपके 20 बाइट्स 16 के कई के लिए गद्देदार)।
फिर आपको दिया गया पता डेटा क्षेत्र का पता होता है। फिर, जब आप ब्लॉक को मुक्त करते हैं, free
तो बस आप जो पता देते हैं, उसे ले लेंगे और यह मानते हुए कि आपने उस पते या उसके आस-पास मेमोरी नहीं भरी है, उसके तुरंत पहले की लेखा जानकारी की जाँच करें। रेखीय रूप से, जो की तर्ज पर होगा:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
हेडर के आकार को ध्यान में रखें और पैडिंग पूरी तरह से कार्यान्वयन परिभाषित है (वास्तव में, पूरी बात कार्यान्वयन-परिभाषित (ए) है लेकिन इन-लाइन अकाउंटिंग विकल्प एक आम है)।
चेकसम और विशेष मार्कर जो लेखांकन जानकारी में मौजूद हैं, अक्सर "मेमोरी एरेना करप्ट" या "डबल फ्री" जैसी त्रुटियों का कारण होता है यदि आप उन्हें ओवरराइट करते हैं या उन्हें दो बार मुक्त करते हैं।
पैडिंग (आवंटन को और अधिक कुशल बनाने के लिए) यही कारण है कि आप कभी-कभी समस्याओं के कारण के बिना अपने अनुरोधित स्थान के अंत से थोड़ा आगे लिख सकते हैं (फिर भी, ऐसा न करें, यह अपरिभाषित व्यवहार है और, सिर्फ इसलिए कि यह कभी-कभी काम करता है, ' टी का मतलब यह करना ठीक है)।
(ए) मैंने malloc
एम्बेडेड सिस्टम के कार्यान्वयन को लिखा है, जहां आपको 128 बाइट्स मिले हैं, चाहे आपने जो भी पूछा हो (जो कि सिस्टम में सबसे बड़ी संरचना का आकार था), यह मानते हुए कि आपने 128 बाइट्स या उससे कम की मांग की है (अधिक के लिए अनुरोध) एक पूर्ण वापसी मूल्य के साथ मुलाकात की)। एक बहुत ही सरल बिट-मास्क (अर्थात, इन-लाइन नहीं) का उपयोग यह तय करने के लिए किया गया था कि 128-बाइट का हिस्सा आवंटित किया गया था या नहीं।
दूसरों को मैंने विकसित किया है 16-बाइट विखंडू, 64-बाइट्स विखंडू, 256-बाइट विखंडू और 1K विखंडू के लिए अलग-अलग पूल, फिर से बिट-मास्क का उपयोग करके यह तय करने के लिए कि क्या ब्लॉक का उपयोग किया गया था या उपलब्ध थे।
इन दोनों विकल्पों ने लेखांकन जानकारी के ओवरहेड को कम करने malloc
और free
(जब मुक्त होने पर आसन्न ब्लॉकों को जोड़ने की आवश्यकता नहीं है) की गति को बढ़ाने में कामयाब रहे , विशेष रूप से उस वातावरण में महत्वपूर्ण जो हम काम कर रहे थे।