Très souvent, malloc
et free
utilisent des services d'allocation de mémoire virtuelle de niveau inférieur et allouent plusieurs pages (ou même des mégaoctets) à la fois, en utilisant des appels système comme mmap et munmap (et peut-être sbrk). Souvent malloc
préfère réutiliser précédemment free
d'espace mémoire le cas échéant. La plupart des malloc
les implémentations utilisent des stratégies diverses et différentes pour les "grandes" et les "petites" allocations, etc...
Notez que l'espace d'adressage virtuel peut être limité, par ex. avec setrlimit(2). Utilisez sous Linux pmap(1) et proc(5) pour en savoir plus sur l'espace d'adressage virtuel de certains processus (par exemple /proc/self/maps
pour le vôtre ou /proc/1234/maps
- aussi le pmap 1234
commande - pour le processus de pid 1234).
Vous pouvez consulter le code source de votre GNU libc, consulter le code source d'autres bibliothèques standard C (telles que musl-libc), lire à propos de malloc
implémentations, choisissez-en d'autres ou implémentez la vôtre, ou utilisez strace pour le découvrir expérimentalement.
Lisez la page de manuel de syscalls (c'est-à-dire syscalls(2)) et le fichier <asm/unistd.h>
pour une liste des appels système.
un malloc
très rapide
Je crois fermement que la norme C est très vague à propos de malloc
et free
. Je suis à peu près sûr que les fonctions suivantes respectent la lettre (mais pas l'esprit) de la norme :
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
Bien sûr, vous coderez calloc
et realloc
en conséquence.
La libc GNU vous donne des crochets pour votre propre malloc
fonctions (et vous pourriez même probablement utiliser le Garbage Collector de Boehm de manière transparente à travers elles). Ces crochets pourraient devenir obsolètes et ne sont pas standard.
Si vous utilisez GNU libc, regardez également mallinfo(3) et malloc_stat(3) et les fonctions associées.
malloc
et free
sont des fonctions de bibliothèque C standard qui doivent être implémentées par chaque implémentation C.
La norme C définit uniquement la manière dont ces fonctions se comportent et le comportement attendu d'elles. Comment ils doivent être mis en œuvre à gauche de chaque mise en œuvre.
En bref, ce sont des détails d'implémentation de l'implémentation que vous utilisez.
(Une "implémentation" se compose du compilateur, de l'éditeur de liens, de la bibliothèque d'exécution et probablement de quelques autres éléments.)