C bellek ayırma işlevlerinin çoğu uygulaması, satır içi veya ayrı olarak her bir blok için muhasebe bilgilerini depolar.
Tipik bir yol (satır içi), hem bir üstbilgi hem de istediğiniz hafızayı minimum boyutta doldurmaktır. Örneğin, 20 bayt istediyseniz, sistem 48 baytlık bir blok ayırabilir:
- 16 baytlık başlık, özel işaretleyici, sağlama toplamı, sonraki / önceki bloğa işaretçiler vb.
- 32 bayt veri alanı (20 baytınız 16'nın katlarına doldurulmuştur).
Daha sonra size verilen adres, veri alanının adresidir. Ardından, bloğu serbest bıraktığınızda, verdiğiniz free
adresi alır ve bu adresi veya çevresindeki belleği doldurmadığınızı varsayarak, muhasebe bilgilerini hemen önce kontrol edin. Grafiksel olarak, bu şu çizgiler boyunca olacaktır:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
Başlık ve dolgu boyutunun tamamen uygulama tanımlı olduğunu unutmayın (aslında, her şey uygulama tanımlıdır (a), ancak satır içi muhasebe seçeneği yaygındır).
Muhasebe bilgilerinde bulunan sağlama toplamları ve özel işaretçiler genellikle üzerine yazdığınızda veya iki kez serbest bırakırsanız "Bellek alanı bozuk" veya "Çift serbest" gibi hataların nedenidir.
Doldurma (ayırmayı daha verimli hale getirmek için) neden bazen sorun yaratmadan talep ettiğiniz alanın sonundan biraz daha fazla yazabilirsiniz (yine de bunu yapmayın, tanımlanmamış davranış ve sadece bazen çalıştığı için Bunu yapmak iyi değil).
(a) İstediğiniz malloc
ne olursa olsun (sistemdeki en büyük yapının boyutu buydu) 128 bayt aldığınız gömülü sistemlerde uygulamalar yazdım , 128 bayt veya daha azını talep ettiğiniz varsayılarak (daha fazlası için istekler bir NULL döndürme değeri ile karşılanacaktır). 128 baytlık bir yığın tahsis edilip edilmediğine karar vermek için çok basit bir bit maskesi (yani satır içi değil) kullanıldı.
Geliştirdiğim diğerlerinde 16 baytlık parçalar, 64 baytlık parçalar, 256 baytlık parçalar ve 1K parçalar için farklı havuzlar vardı, yine hangi blokların kullanıldığına veya mevcut olduğuna karar vermek için bir bit maskesi kullandılar.
Her iki seçenek de muhasebe bilgilerinin ek yükünü azaltmayı ve çalıştığımız ortamda özellikle önemli olan malloc
ve free
(serbest bırakırken bitişik blokları birleştirmeye gerek yok) hızını artırmayı başardı .