Jawatan ini dibina pada yang sebelumnya, menangani pemecahan memori dalam peruntukan memori tersuai. Isu teras adalah berulang kali memperuntukkan dan membebaskan blok kecil mewujudkan banyak jurang yang kecil dan tidak dapat digunakan dalam ingatan, mencegah peruntukan yang lebih besar walaupun terdapat ruang bebas yang mencukupi. Artikel ini memperincikan penyelesaian: menggabungkan blok percuma bersebelahan.
Masalah: Pemecahan memori
Penulis menggambarkan pemecahan dengan contoh kod dan gambar rajah. Peruntukan kecil diikuti oleh deallocations meninggalkan ruang kosong yang berpecah. Peruntukan yang lebih besar seterusnya gagal kerana tiada blok bebas tunggal cukup besar, walaupun ruang bebas gabungan melebihi permintaan. Gambar rajah secara visual menunjukkan masalah ini, menunjukkan betapa kecilnya blok yang dibebaskan menghalang penggunaan semula kawasan yang lebih besar.
Penyelesaian ini melibatkan penggabungan blok bebas bersebelahan untuk menghasilkan potongan memori yang lebih besar dan boleh digunakan. Penulis refactors kod untuk pembacaan dan penggunaan semula yang lebih baik, memperkenalkan beberapa fungsi penolong:
: Mengembalikan penunjuk ke kawasan memori yang boleh diakses oleh pengguna dalam blok.
header_user_area(Header *header)
header_address_after_block(Header *header)
header_previous_available(Header *header)
header_next_available(Header *header)
header_merge(Header *header)
Fungsi diubahsuai untuk memanggil abfree()
sebelum membebaskan memori. Ini memastikan bahawa mana -mana blok percuma bersebelahan digabungkan sebelum memori dikeluarkan kembali ke sistem.
kesimpulan dan langkah seterusnya abfree()
header_merge()
Fungsi yang lebih baik abfree()
, bersama -sama dengan fungsi penolong, dengan ketara mengurangkan pemecahan ingatan. Penulis mencatatkan bahawa satu cabaran akhir kekal: penjajaran blok memori, yang akan ditangani dalam jawatan seterusnya. Fungsi yang lengkap, dikemas kini abfree()
dan fungsi sokongannya disediakan pada akhir artikel.
Atas ialah kandungan terperinci Melaksanakan malloc () dan percuma () - menggabungkan blok kecil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!