2

私は ( http://www.nobugs.org/developer/win32/debug_crt_heap.html )、HeapAlloc が要求されたメモリ ブロックに加えて簿記用のメモリを割り当てることを読みました。簿記情報のサイズは 40 バイトにする必要があります (ブロックの前に 8 バイト、後に 32 バイト)。

ただし、VS2010 でテストを実行すると、実際に消費されるメモリは大幅に少ないことがわかりました。たとえば、1M int をセットに挿入します。私は malloc のフック関数を書き、すべての挿入が別の動的メモリ割り当て要求をトリガーして新しいノードを構築するようにしました。フックによると、1 つのノードには 20 バイトが必要です。80 バイトのオーバーヘッドを追加すると、1 つのノードの合計メモリは 100 バイトになります。つまり、このセットは最大 100 MB を消費する必要がありますが、TaskManager によると、わずか 32 MB しか消費しません。

したがって、次の質問があります。

オーバーヘッドは本当に 40 バイトですか? オーバーヘッドはすべての HeapAlloc'ed ブロックに適用されますか?

4

2 に答える 2

0

malloc割り当てごとにHeapAllocを呼び出すわけではないと確信しています。確かに、glibcの場合、OSはメモリのより大きなチャンクを提供するためにのみ呼び出され、それは分割されます-OS割り当てのオーバーヘッドよりも小さなオーバーヘッドで。

malloc呼び出しに時間をかけることとHeapAlloc、メモリの小さなブロック(20バイトなど)に対して100万回呼び出すことでテストできます。どちらに時間がかかりますか?HeapAllocの方が速い場合、HeapAllocすべての人に呼び出されるのはもっともらしいですが、それはかなり速いとmalloc思います。malloc

于 2013-02-01T10:44:26.070 に答える
0

これは混乱の問題のようです。タスク マネージャーに物理メモリと仮想メモリのどちらが表示されるかわかりません。

割り当てがファイルをスワップしようとしている場合、それらはタスク マネージャーに反映されない可能性があります。より高度なパフォーマンス監視ツールを試す必要があります。

于 2013-02-01T10:37:38.823 に答える