Velmi často malloc a free používají služby alokace virtuální paměti nižší úrovně a alokují několik stránek (nebo dokonce megabajtů) najednou pomocí systémových volání jako mmap a munmap (a možná sbrk). Často malloc preferuje opětovné použití dříve free d paměťový prostor, pokud je to relevantní. Nejvíce malloc implementace používají různé a různé strategie pro "velké" a "malé" alokace atd...
Všimněte si, že virtuální adresní prostor může být omezen, např. se setrlimit(2). Použijte v Linuxu pmap(1) a proc(5), abyste se dozvěděli více o virtuálním adresovém prostoru nějakého procesu (např. /proc/self/maps pro váš vlastní nebo /proc/1234/maps - také pmap 1234 příkaz - pro proces pid 1234).
Můžete se podívat na zdrojový kód GNU libc, podívat se na zdrojový kód jiných standardních knihoven C (jako je musl-libc), přečíst si o malloc implementace, vyberte nějaké jiné nebo implementujte své vlastní, nebo použijte strace k experimentálnímu zjištění.
Přečtěte si manuálovou stránku syscalls (tj. syscalls(2)) a soubor <asm/unistd.h> pro seznam systémových volání.
velmi rychlý malloc
Pevně věřím, že standard C je velmi vágní ohledně malloc a free . Jsem si docela jistý, že následující funkce respektují literu (ale ne ducha) standardu:
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
Samozřejmě zadáte kód calloc a realloc podle toho.
GNU libc vám nabízí háčky pro vaše vlastní malloc funkcí (a dokonce byste pravděpodobně mohli transparentně používat Boehm's Garbage Collector). Tyto háčky mohou být zastaralé a jsou nestandardní.
Pokud používáte GNU libc, podívejte se také na mallinfo(3) a malloc_stat(3) a související funkce.
malloc a free jsou standardní funkce knihovny C, které mají být implementovány každou implementací C.
Standard C pouze definuje způsob, jakým se tyto funkce chovají, a chování, které se od nich očekává. Jak mají být implementovány, je ponecháno na každé implementaci.
Stručně řečeno, jsou to implementační detaily implementace, kterou používáte.
("Implementace" se skládá z kompilátoru, linkeru, runtime knihovny a pravděpodobně několika dalších věcí.)