多くの場合、malloc
と free
低レベルの仮想メモリ割り当てサービスを使用し、mmap や munmap (およびおそらく sbrk) などのシステム コールを使用して、一度に複数のページ (またはメガバイト) を割り当てています。多くの場合 malloc
以前の再利用を好む free
d メモリ空間 (関連する場合)。ほとんどの malloc
実装では、「大きい」割り当てと「小さい」割り当てなどにさまざまな異なる戦略が使用されます...
仮想アドレス空間は制限される可能性があることに注意してください。 setrlimit(2) で。 Linux で pmap(1) および proc(5) を使用して、プロセスの仮想アドレス空間について詳しく知ることができます (例:/proc/self/maps
あなた自身のものまたは /proc/1234/maps
- pmap 1234
も コマンド - pid 1234 のプロセス用)。
GNU libc ソース コードを調べたり、他の C 標準ライブラリ (musl-libc など) のソース コードを調べたり、malloc
について読んだりできます。 他の実装を選択するか、独自の実装を実装するか、strace を使用して実験的に調べてください。
syscalls の man ページ (つまり syscalls(2)) とファイル <asm/unistd.h>
を読んでください。 システムコールのリスト。
非常に高速な malloc
C 標準は malloc
について非常に曖昧であると強く信じています そして free
.以下の関数は、標準の文字 (ただし、精神ではない) を尊重していると確信しています:
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
もちろん、calloc
をコーディングします。 と realloc
GNU libc は、独自の malloc
のフックを提供します 関数 (そしておそらく、Boehm のガベージ コレクターを透過的に使用することもできます)。これらのフックは廃止される可能性があり、非標準です。
GNU libc を使用している場合は、malinfo(3) と malloc_stat(3) および関連する関数も調べてください。
malloc
と free
各 C 実装によって実装される標準 C ライブラリ関数です。
C 標準では、これらの関数の動作方法と期待される動作のみが定義されています。それらがどのように実装されるかは、各実装に委ねられています。
つまり、使用する実装の実装の詳細です。
(「実装」は、コンパイラ、リンカー、ランタイム ライブラリ、およびおそらくその他のいくつかのもので構成されます。)