11

最近、次の投稿を見ました。

メモリ アロケータは、malloc より下位レベルではありません。(デフォルトのアロケータは通常、malloc を直接または間接的に呼び出します)

アロケーターを使用すると、さまざまな割り当て戦略を指定できます。たとえば、malloc を 1 回呼び出すアロケータを使用して大きなメモリ プールを取得し、その後の割り当て要求では、このプールの小さなチャンクを返すだけです。

または、メモリが割り当てられたり解放されたりするたびに追加のタスクを実行できるようにするためのフックとして使用することもできます。

2 番目の質問については、malloc は、移植性を失うことなく実行できる最低の値です。malloc は通常、OS 固有のメモリ割り当て関数を使用して実装されるため、それはまだ低レベルです。しかし、C++ アロケーターは高レベルの抽象化であるため、それは主な質問とは関係ありません。

from: C++: メモリ アロケータ

私の質問は、次のオペレーティング システムで malloc がどのように実装されているかです。

  • Windows用
  • Linux 用

malloc() の呼び出し/実装である OS 固有の関数は何ですか?

4

5 に答える 5

13

Windows では、MSVC の最近のバージョンでは、 malloc (および C++ new、の実際のメモリ割り当て部分と同じ基本を使用して実装されているためnew) が呼び出されますHeapAlloc()。g++ mingw などの他のバージョンでは、C ランタイムは古いバージョンであり、 を直接呼び出すことはあまりありませんHeapAllocが、そのベースでは、依然としてHeapAlloc- 別のものを見つけるには、に戻る必要があります。 95 より前の Windows には一連の関数がありましたが、GlobalAlloc最近LocalAllocでは 16 ビット コンパイラを使用している人はいないと思います。少なくとも Windows プログラミングではそうです。

Linux で を使用している場合、それが呼び出すかglibcどうかは、割り当てのサイズに依存します- (フラグで) より大きな割り当てに使用されます (しきい値を超えており、典型的な実装では 2MB であると私は信じています)。sbrkmmapmmapMAP_ANONYMOUS

于 2013-08-03T14:07:20.077 に答える
1

わかりました、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 でヒープ割り当て関数を使用します。

これが役立つことを願っています。

于 2013-08-03T13:58:43.383 に答える
0

Windows では、実装は通常、、、、などのmallocwin32 ヒープ関数を呼び出します。これらの関数は、ntdll.dll 内にある NTDLL ユーザーモード ヒープ マネージャーを呼び出します。これらの関数には、、、などの名前が付けられます。HeapCreateHeapDestroyHeapAllocHeapFreeRtlxxxHeapRtlAllocateHeapRtlCreateHeap

NtxxxVirtualMemory最終的に、グループ内のシステム コールは、 NtAllocateVirtualMemoryNtQueryVirtualMemory、と呼ばれNtFreeVirtualMemoryます。

于 2020-10-19T13:58:25.733 に答える