オブジェクトの数が増えるにつれてメモリがどのように割り当てられるかを理解しようとしています。テストプログラムには、400万個のオブジェクトが作成され、そのメモリ占有量は約23GBです。C++オブジェクトメモリ管理
なぜ単一のオブジェクトサイズがわずか16バイトである間に、このような膨大なメモリを占有しますか?理想的には私はそれが4億倍の16倍になるはずだと思います。
struct class1 {
long long id;
double value=0.0;
class1(long long id) {
this.id = id;
}
};
for (int i=1;i<=400000000;i++) {
class1 *t = new class1(i);
}
ダイナミックに割り当てられたブロックは、通常、サイズを丸めます(実際には、使用可能なサイズは通常、新しいオペレータが求めたサイズよりもやや大きい)、管理データオーバーヘッドを少し追加します。動的に割り当てられたものは通常かなり広がっています(キャッシュの局所性が悪い)。これはできるだけ多くの新しい/ malloc呼び出しを割り当てることをお勧めします。 – PSkocik
クラスフットプリント(https://stackoverflow.com/questions/937773/how-do-you-determine-the-size-of-an-object-in-cを参照)、パディング、およびコンパイラフラグも調べます。 – ioanb7
小さな割り当てをたくさんすると、メモリ空間が断片化する傾向があります。また、あなたのメモリアロケータは、一度に16バイト(一度に1ページのような)よりも大きなチャンクを一度に割り当てるかもしれません。また、あなたのクラスはちょうど16バイトではないかもしれません。そこにはパディングがあります(アロケータオーバーヘッド)。良いことは、あなたが*メモリに書き込まないならば、OSは物理的なページ(少なくともLinuxカーネルではない)で割り振りを元に戻すわけではないので、何もコストがかからないということです。 –