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í.)