Sangat sering, malloc
dan free
menggunakan layanan alokasi memori virtual tingkat rendah dan mengalokasikan beberapa halaman (atau bahkan megabita) sekaligus, menggunakan pemanggilan sistem seperti mmap dan munmap (dan mungkin sbrk). Seringkali malloc
lebih suka menggunakan kembali sebelumnya free
d ruang memori bila relevan. Kebanyakan malloc
implementasi menggunakan berbagai strategi yang berbeda untuk alokasi "besar" dan "kecil", dll...
Perhatikan bahwa ruang alamat virtual dapat dibatasi, mis. dengan setrlimit(2). Gunakan pmap(1) dan proc(5) di Linux untuk mempelajari lebih lanjut tentang ruang alamat virtual dari beberapa proses (mis. /proc/self/maps
untuk Anda sendiri atau /proc/1234/maps
- juga pmap 1234
perintah - untuk proses pid 1234).
Anda dapat melihat kode sumber libc GNU Anda, melihat kode sumber pustaka standar C lainnya (seperti musl-libc), membaca tentang malloc
implementasi, pilih yang lain atau terapkan sendiri, atau gunakan strace untuk mencari tahu secara eksperimental.
Baca halaman manual syscalls (yaitu syscalls(2)) dan file <asm/unistd.h>
untuk daftar panggilan sistem.
malloc
yang sangat cepat
Saya sangat yakin bahwa standar C sangat tidak jelas tentang malloc
dan free
. Saya cukup yakin bahwa fungsi-fungsi berikut menghormati huruf (tetapi bukan semangat) dari standar:
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
Tentu saja Anda akan membuat kode calloc
dan realloc
sesuai.
GNU libc memberi Anda pengait untuk malloc
Anda sendiri fungsi (dan Anda bahkan mungkin dapat menggunakan Pengumpul Sampah Boehm secara transparan melaluinya). Pengait ini dapat menjadi usang dan tidak standar.
Jika menggunakan libc GNU, lihat juga mallinfo(3) dan malloc_stat(3) dan fungsi terkait.
malloc
dan free
adalah fungsi pustaka C standar yang akan diimplementasikan oleh setiap implementasi C.
Standar C hanya mendefinisikan cara fungsi-fungsi ini berperilaku dan perilaku yang diharapkan darinya. Bagaimana mereka akan diterapkan di kiri untuk setiap implementasi.
Singkatnya mereka adalah detail implementasi dari implementasi yang Anda gunakan.
("Implementasi" terdiri dari kompiler, penaut, pustaka runtime, dan mungkin beberapa hal lainnya.)