Sebagian besar implementasi fungsi alokasi memori C akan menyimpan informasi akuntansi untuk setiap blok, baik in-line atau secara terpisah.
Salah satu cara khas (in-line) adalah untuk benar-benar mengalokasikan header dan memori yang Anda minta, diisi hingga beberapa ukuran minimum. Jadi misalnya, jika Anda meminta 20 byte, sistem dapat mengalokasikan blok 48 byte:
- Header 16 byte yang berisi ukuran, marker khusus, checksum, pointer ke blok berikutnya / sebelumnya dan seterusnya.
- Area data 32 byte (20 byte Anda diisi hingga kelipatan 16).
Alamat yang kemudian diberikan kepada Anda adalah alamat area data. Kemudian, ketika Anda membebaskan blok, free
hanya akan mengambil alamat yang Anda berikan dan, dengan asumsi Anda belum memasukkan alamat itu atau memori di sekitarnya, periksa informasi akuntansi segera sebelum itu. Secara grafis, itu akan sepanjang garis:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
Perlu diingat ukuran header dan padding sepenuhnya implementasi didefinisikan (sebenarnya, semuanya didefinisikan implementasi (a) tetapi opsi akuntansi in-line adalah yang umum).
Checksum dan spidol khusus yang ada dalam informasi akuntansi sering menjadi penyebab kesalahan seperti "Memory Arena rusak" atau "Gratis ganda" jika Anda menimpa mereka atau membebaskan mereka dua kali.
Padding (untuk membuat alokasi lebih efisien) adalah mengapa Anda kadang-kadang dapat menulis sedikit di luar batas ruang yang Anda minta tanpa menimbulkan masalah (tetap saja, jangan lakukan itu, itu perilaku yang tidak ditentukan dan, hanya karena itu bekerja kadang-kadang, tidak t berarti tidak apa-apa untuk melakukannya).
(a) Saya sudah menulis implementasi malloc
dalam sistem embedded di mana Anda mendapat 128 byte tidak peduli apa yang Anda minta (itu adalah ukuran struktur terbesar dalam sistem), dengan asumsi Anda meminta 128 byte atau kurang (permintaan untuk lebih banyak akan harus dipenuhi dengan nilai pengembalian NULL). Bit-mask yang sangat sederhana (yaitu, bukan in-line) digunakan untuk memutuskan apakah sepotong 128-byte dialokasikan atau tidak.
Yang lain yang saya kembangkan memiliki kumpulan yang berbeda untuk potongan 16-byte, potongan 64-byte, potongan 256-byte, dan potongan 1K, sekali lagi menggunakan bit-mask untuk memutuskan blok apa yang digunakan atau tersedia.
Kedua opsi ini berhasil mengurangi overhead informasi akuntansi dan untuk meningkatkan kecepatan malloc
dan free
(tidak perlu menyatukan blok yang berdekatan ketika membebaskan), terutama penting dalam lingkungan tempat kami bekerja.