Windows では、MSVC の最近のバージョンでは、malloc (および C++ new
new
の実際のメモリ割り当て部分と同じ基本を使用して実装されているため ) HeapAlloc()
を呼び出します . g++ mingw などの他のバージョンでは、C ランタイムは古いバージョンであり、HeapAlloc
を直接呼び出すことはほとんどありません。 、しかし、そのベースでは、まだ HeapAlloc
に行きます - 別のものを見つけるには、GlobalAlloc
があった Windows 95 より前に戻る必要があります。 と LocalAlloc
関数のセット - しかし、最近は 16 ビット コンパイラを使用している人はいないと思います - 少なくとも Windows プログラミングでは.
Linux で glibc
を使用している場合 、 sbrk
を呼び出すかどうかは、割り当てのサイズに依存します または mmap
- mmap
(MAP_ANONYMOUS
の場合) フラグ内) は、より大きな割り当てに使用されます (しきい値を超えています。典型的な実装では 2MB だと思います)
malloc() とその仲間は、コンパイラに付属するランタイム システムの一部と見なされます。そのため、各コンパイラは異なる OS 呼び出しを使用して malloc を実装できます。
他の人が言ったように、Linux ではオプションは sbrk() と mmap() です。
Windows では、オプションは HeapAlloc() と VirtualAlloc() です。
<ブロック引用>
私の質問は、次のオペレーティング システムで malloc がどのように実装されているかです。
Linux では、有名な malloc
が 2 つあります。 実装:
dlmalloc (Doug Lea の malloc)
ptmalloc
glibc、eglibc、または newlib などの Linux libc では、ptmalloc または ptmalloc のバリアントを実装します。
<ブロック引用>呼び出される OS 固有の関数と malloc() の実装は何ですか?
Unix および Linux システムの場合 sbrk
と mmap
システムコールが使用されます。 man 2 sbrk
を参照 と man 2 mmap
詳細については、
わかりました。Linux についてはわかりませんが、Windows に関しては...
メモリは、2 つの分類された場所に割り当てることができます。
1) ヒープ (プロセス ヒープ、カスタム作成ヒープ) 参照 -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx HeapAlloc や HeapFree などの関数を使用。 LocalAlloc と LocalFree は、デフォルトのプロセス ヒープに割り当てたい場合に、HeapAlloc への「ショートカット」として使用できます。
2)VirtualAlloc、VirtualFreeを使用した仮想メモリ(通常は、セキュリティのためのグローバル仮想メモリへのアクセス制限のため、プロセス固有のみ)。参照 -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx
私の知る限り、malloc は Windows でヒープ割り当て関数を使用します。
これがお役に立てば幸いです。