การใช้งานส่วนใหญ่ของฟังก์ชั่นการจัดสรรหน่วยความจำ C จะเก็บข้อมูลการบัญชีสำหรับแต่ละบล็อกไม่ว่าจะเป็นแบบอินไลน์หรือแยกกัน
วิธีทั่วไปหนึ่ง (ในบรรทัด) คือการจัดสรรทั้งส่วนหัวและหน่วยความจำที่คุณขอจริง ๆ โดยมีขนาดเล็กที่สุด ตัวอย่างเช่นหากคุณถามถึง 20 ไบต์ระบบอาจจัดสรรบล็อกขนาด 48 ไบต์:
- ส่วนหัวขนาด 16- ไบต์ที่มีขนาดเครื่องหมายพิเศษเช็คซัมพอยน์เตอร์ไปยังบล็อกถัดไป / ก่อนหน้าและอื่น ๆ
- พื้นที่ข้อมูล 32 ไบต์ (20 ไบต์ของคุณมีขนาดเท่ากับ 16)
ที่อยู่ที่มอบให้กับคุณคือที่อยู่ของพื้นที่ข้อมูล จากนั้นเมื่อคุณปล่อยบล็อกฟรีfree
จะใช้ที่อยู่ที่คุณให้ไว้และสมมติว่าคุณยังไม่ได้ยัดที่อยู่หรือหน่วยความจำรอบ ๆ นั้นให้ตรวจสอบข้อมูลการบัญชีทันทีก่อน ชัดเจนว่าจะเป็นไปตามแนวของ:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
โปรดจำไว้ว่าขนาดของส่วนหัวและช่องว่างภายในมีการใช้งานทั้งหมดที่กำหนดไว้ (จริง ๆ แล้วสิ่งทั้งหมดคือการดำเนินการที่กำหนดไว้(a)แต่ตัวเลือกการบัญชีในบรรทัดเป็นเรื่องธรรมดา)
เช็คซัมและเครื่องหมายพิเศษที่มีอยู่ในข้อมูลการบัญชีมักเป็นสาเหตุของข้อผิดพลาดเช่น "หน่วยความจำเวทีเสียหาย" หรือ "ฟรีสองครั้ง" หากคุณเขียนทับหรือเพิ่มพวกเขาสองครั้ง
การแพ็ดดิ้ง (เพื่อให้การจัดสรรมีประสิทธิภาพมากขึ้น) คือสาเหตุที่บางครั้งคุณสามารถเขียนนิดหน่อยเกินจุดสิ้นสุดของพื้นที่ที่ร้องขอของคุณโดยไม่ก่อให้เกิดปัญหา (ยังไม่ทำอย่างนั้นมันเป็นพฤติกรรมที่ไม่ได้กำหนด ไม่ได้หมายความว่าจะทำ)
(a)ฉันเขียนการใช้งานของmalloc
ในระบบฝังตัวที่คุณมี 128 ไบต์ไม่ว่าคุณจะถามอะไร (นั่นคือขนาดของโครงสร้างที่ใหญ่ที่สุดในระบบ) โดยสมมติว่าคุณขอ 128 ไบต์หรือน้อยกว่า พบกับค่าตอบแทน NULL) บิตมาสก์ที่ง่ายมาก (เช่นไม่ใช่ในบรรทัด) ถูกใช้เพื่อตัดสินใจว่ามีการจัดสรรก้อนขนาด 128 ไบต์หรือไม่
คนอื่น ๆ ที่ฉันพัฒนาขึ้นนั้นมีกลุ่มที่ต่างกันสำหรับ 16-byte chunks, 64-bytes chunks, 256-byte chunks และ 1K chunks อีกครั้งโดยใช้ bit-mask เพื่อตัดสินใจว่าจะใช้บล็อกหรือบล็อกใด
ตัวเลือกทั้งสองนี้สามารถจัดการเพื่อลดค่าใช้จ่ายของข้อมูลการบัญชีและเพื่อเพิ่มความเร็วmalloc
และfree
(ไม่จำเป็นต้องรวมบล็อกที่อยู่ติดกันเมื่อพ้น) โดยเฉพาะอย่างยิ่งสิ่งสำคัญในสภาพแวดล้อมที่เรากำลังทำงานอยู่