2016-07-23 21 views
1

Mac OSでシンプルなC++プログラムを作成しています。私はちょうどトップが間違ったメモリ使用量を示している可能性があります

int main() 
{ 
    int *n = new int[50000000]; 
} 

私はlldbでこのプログラムを起動し、nが割り当てられている行にブレークポイントを置いています。他のタブでtopを起動すると、そのメモリ使用量が336Kの事前割り当てであることがわかります。私がlldbの中でnを実行すると、nの割り当てが行われるので、私は自分のメモリ使用量が上がることを期待しています。しかし、topは私のプログラムで使用されているのと同じ量のメモリを示しています。これの理由は何でしょうか?私はメモリ割り当てがC++でどのように起こるかを理解しようとしています。これが私がこれをやっている理由です。

私はmainのスコープを終了していません。私がもう一度上をチェックすると、私はメインの中括弧を閉じて座っている。

+3

のために割り当てはおそらく唯一の仮想アドレス空間を確保している、あなたは、いくつかのプロファイリングツールが必要です。実際のメモリは、各ページに触れるまではOSによって割り当てられません。 4Kごとに1バイトを書き込むforループを追加します。 –

答えて

1

topコマンドは、オペレーティングシステムによって表示されるプロセスの統計情報を表示します。どのくらいの量のメモリがプロセスに割り当てられたかを示しますが、このメモリのうちどれだけが効果的に使用されているかはわかりません。メモリ割り当ての監視は正確ではありません。

ヒープとフリーストアによるメモリ割り当ては、実装がC++に依存しています。しかし、通常、ttはOS割り当て呼び出しで1対1にマッピングされません。パフォーマンス上の理由から、メモリは大きな塊でOSから受信される(OSへの呼び出しは、あなたのユーザランドのコード内の呼び出しよりも遅い):

  • C++ランタイムが開始したとき、それは通常では、OSからのいくつかのメモリを割り当て標準ライブラリオブジェクトに必要なメモリを割り当て、フリーストアを初期化して割り当て要求をすばやく満たすことができます。
  • この初期メモリが使い果たされた場合のみ、標準ライブラリはオペレーティングシステムからより多くのメモリを割り当てます。
  • そして、より大きなチャンクで割り当てが行われるため、newのすべてがOSコールを呼び出すとは限りません。

あなたの観察から、私はこの初期割り当てが50 MBより大きいと思います。違いを見るためにはもっと大きな値を試してみてください。

あなたがより正確にメモリ消費を追跡する場合の例valgrindまたはheap command

関連する問題