Sehr oft, malloc
und free
verwenden virtuelle Speicherzuweisungsdienste auf niedrigerer Ebene und weisen mehrere Seiten (oder sogar Megabytes) auf einmal zu, indem sie Systemaufrufe wie mmap und munmap (und vielleicht sbrk) verwenden. Oft malloc
zieht es vor, vorher wiederzuverwenden free
d Speicherplatz, falls relevant. Die meisten malloc
Implementierungen verwenden verschiedene und unterschiedliche Strategien für "große" und "kleine" Allokationen usw....
Beachten Sie, dass der virtuelle Adressraum begrenzt sein kann, z. mit setrlimit(2). Verwenden Sie unter Linux pmap(1) und proc(5), um mehr über den virtuellen Adressraum einiger Prozesse zu erfahren (z. B. /proc/self/maps
für Ihr eigenes oder /proc/1234/maps
- auch die pmap 1234
Befehl - für den Prozess von PID 1234).
Sie könnten sich Ihren GNU-Libc-Quellcode ansehen, in den Quellcode anderer C-Standardbibliotheken (wie etwa musl-libc) schauen, über malloc
lesen Implementierungen, wählen Sie andere oder implementieren Sie Ihre eigenen oder verwenden Sie strace, um es experimentell herauszufinden.
Lesen Sie die syscalls Manpage (d.h. syscalls(2)) und die Datei <asm/unistd.h>
für eine Liste von Systemaufrufen.
ein sehr schnelles malloc
Ich glaube fest daran, dass der C-Standard bezüglich malloc
sehr vage ist und free
. Ich bin mir ziemlich sicher, dass die folgenden Funktionen den Buchstaben (aber nicht den Geist) des Standards respektieren:
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
Natürlich codieren Sie calloc
und realloc
entsprechend.
Die GNU libc gibt Ihnen Hooks für Ihren eigenen malloc
Funktionen (und Sie könnten wahrscheinlich sogar Boehms Garbage Collector transparent durch sie verwenden). Diese Hooks könnten veraltet sein und sind nicht standardisiert.
Wenn Sie die GNU libc verwenden, sehen Sie sich auch mallinfo(3) und malloc_stat(3) und verwandte Funktionen an.
malloc
und free
sind Standard-C-Bibliotheksfunktionen, die von jeder C-Implementierung implementiert werden müssen.
Der C-Standard definiert lediglich, wie sich diese Funktionen verhalten und welches Verhalten von ihnen erwartet wird. Wie sie zu implementieren sind, bleibt der jeweiligen Implementierung überlassen.
Kurz gesagt handelt es sich um Implementierungsdetails der von Ihnen verwendeten Implementierung.
(Eine "Implementierung" besteht aus dem Compiler, dem Linker, der Laufzeitbibliothek und wahrscheinlich ein paar anderen Dingen.)