2

わかりましたので、int が実際に RAM 上で 4 バイトの重みを持っているかどうかを知りたいと思っていました。
だから私はこのコードで1,000,000の整数を作りました。

for(int i = 0;i < 1000000;++i)   
    int *as= new int;  

このコード行を実行する前に、ブレークポイントを直前に置いて、どのくらいのヘッドオーバーが開始されているかを確認します。
ヘッドオーバーはほとんどありません。私のプログラムは 750 kb から始まります。

しかし、ループを終了した後、int の重みが 32 ビットの場合、プログラムは 4,000 kb であると仮定すると、32,000 kb を使用します。
言及する価値のあるもう1つのことは、ctrl+altk + deleteメソッドを使用して、プログラムがRAMからどれだけのスペースを取っているかを確認し、それをVisual C++ 2010 Expressで実行していることです。

また、私のPCのintは32ビットであり、64ではなく、32ではなく64であったとしても、32,000 kbではなく8,000 kbである必要があるため、重要ではありません。
ですから、PC でこれを試してみて、同じ結果が得られるかどうか教えてください。

私がどこで間違ったのか知っているなら教えてください。

4

4 に答える 4

6

メモリの 4 バイト チャンクは小さすぎて管理する価値がありません。また、キャッシュ ラインを共有するコード オブジェクトの潜在的に無関係なチャンクを与えることで、パフォーマンスが低下する可能性もあります。

一般的なメモリ マネージャの最小チャンク サイズは、16 ~ 256 バイトです。また、通常、特定のサイズのチャンクが割り当てられたという事実を追跡するために、ある程度のオーバーヘッドが必要になります。

于 2012-09-27T22:53:23.387 に答える
3

メモリ マネージャーには、さまざまなブロックを追跡するためのオーバーヘッドがあります。また、バッファ オーバーフローの発見に役立つ追加のビットを割り当てることもあります。一部には、割り当てる最小サイズのブロックがあります。

于 2012-09-27T22:53:34.527 に答える
2

ヒープ マネージャーが提供するメモリの各ブロックには、それに関連付けられた追加情報 (サイズなど) があるため、ヒープ割り当てに関連するオーバーヘッドが発生します。

また、通常、ヒープ マネージャーはそのような小さなブロックを提供しません。これはint、ヒープから単一の s を要求する人はほとんどいないためです (とりわけ、前述の余分な簿記は、このような小さな割り当てを悪い考えにします)。したがって、int得られるそれぞれは、おそらくヒープが管理するメモリの最小のチャンクであり、int.

于 2012-09-27T22:56:34.490 に答える
1

スタックではなくヒープに整数ポインターを割り当てています。

int ごとに 4 バイト (32 ビット) が割り当てられていますが、ポインターごとに 8 バイト (64 ビット) が割り当てられており、メモリ割り当てへの割り当てオーバーヘッドも見られます。

于 2012-09-27T22:56:09.593 に答える