9

特に最近の Visual Studio C++ コンパイラを使用した Windows 上の C++ について考えると、ヒープの実装について疑問に思っています。

リリース コンパイラを使用していて、メモリの断片化やパッキングの問題に関心がないと仮定すると、ヒープにメモリを割り当てることに関連するメモリ オーバーヘッドはありますか? もしそうなら、これは割り当てごとにおよそ何バイトになるでしょうか? 64-bitよりもコードが大きくなります32-bitか?

最新のヒープ実装についてはよくわかりませんが、割り当てごとにマーカーがヒープに書き込まれるかどうか、または何らかの種類のテーブル (ファイル割り当てテーブルなど) が維持されるかどうか疑問に思っています。

関連するポイント (主に「マップ」などの標準ライブラリ機能について考えているため) では、Microsoft 標準ライブラリの実装は、ヒープの使用を最適化するために (ツリー ノードなどのために) 独自のアロケーターを使用しますか?

4

3 に答える 3

4

Visual C++ は、割り当てられたバッファーの境界近くに制御情報 (リンク/サイズ、および場合によってはいくつかのチェックサム) を埋め込みます。これは、メモリの割り当てと割り当て解除中にいくつかのバッファ オーバーフローをキャッチするのにも役立ちます。

malloc()その上、すべての基本型 ( charintlong longdouble、 ) に対して適切にアラインされたポインターを返す必要があることvoid*void(*)()およびアラインメントは通常、最大の型のサイズであるため、8 バイトまたは 16 バイトになる可能性があることを覚えておく必要があります。1 バイトを割り当てると、7 から 15 バイトがアラインメントのみで失われる可能性があります。同じ動作をするかどうかはわかりませんoperator newが、そうである可能性が非常に高いです。

これはあなたにアイデアを与えるはずです。正確なメモリの浪費は、ドキュメント (存在する場合) またはテストからのみ判断できます。言語標準は、それをいかなる用語でも定義していません。

于 2013-04-08T14:16:01.093 に答える