コンテンツへスキップ

次の C++ 式はヒープ上でどれだけの仮想メモリを割り当てるか?

答えは少なくとも 4 キビバイトだが、確実にもっと多い。

まず、各ヒープメモリ割り当てには、割り当てられた内容を追跡するためのメモリが必要となる。プログラムがアクセスできないオーバーヘッドとして、おそらく 8 バイト程度を使用している。

次に、メモリアロケータは要求した 4096 バイトより少し多めに割り当てる場合がある。Linux マシンでは 4104 バイトを割り当てることがわかり、プログラムが使用可能な 8 バイトの余分な領域がある。この値は Linux で malloc_usable_size を呼び出すことで確認できる。

したがって、全体として 4096 バイトを要求したときに 16 バイト余分に割り当てられる可能性がある。オーバーヘッドは約 0.4% となる。基本的に割り当てる 256 バイトごとに 1 バイトを無駄にしていることになる。

しかし、これが最悪のケースではない。macOS では次のコード行を考えてみよう。

システムは 4096 バイトの割り当てを報告する:14% のオーバーヘッドである。macOS は中程度の小さい割り当てに対して、メモリ割り当てを最も近い 512 バイト境界に丸めることが原因である。さらに大きなメモリブロックを割り当てようとすると、さらに大きく丸めるようになる。

公開者

記事ナビゲーション