ベクトルのベクトルのメモリ内のサイズを推定しようとしていますが、正しい概算が得られないようです。
チェックするために書いた小さなコードは次のとおりです。
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
size_t n = 100;
size_t m = 1000000;
float sizeInKB = (sizeof(vector<vector<int> >) + n*sizeof(vector<int>) + n*m*sizeof(int))/1024.0f;
cout << sizeInKB << " KB" << endl;
vector<vector<int> > vect(n);
for(int i = 0; i < n; ++i)
{
vect[i].resize(m);
}
while(true)
{}
return EXIT_SUCCESS;
}
出力として 390,630 KB が得られますが、タスク マネージャーによると、アプリケーションは 394,588 KB のメモリを必要とします。これは、アプリケーション (特にベクトル) が使用しているメモリの量を知る最良の方法ではないことに同意しますが、良いヒントが得られます。4 MB は数 KB だけではありません。
ベクトルのベクトルのベクトルのメモリ内のサイズを推定しようとすると、ますます面倒になります。int
同じコードで、次のように置き換えますvector<int>
。
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
size_t n = 100;
size_t m = 1000000;
float sizeInKB = (sizeof(vector<vector<vector<int> > >) + n*sizeof(vector<vector<int> >) + n*m*sizeof(vector<int>))/1024.0f;
cout << sizeInKB << " KB" << endl;
vector<vector<vector<int> > > vect(n);
for(int i = 0; i < n; ++i)
{
vect[i].resize(m);
}
while(true)
{}
return EXIT_SUCCESS;
}
出力として 4 687 500 KB が得られますが、タスク マネージャーによると、アプリケーションは 6 271 028 KB のメモリを必要とします。1.5 GB 以上の差があります。このオーバーヘッドはどこから来ているのでしょうか。それを計算する方法はありますか?
Visual Studio 2008を使用して、Windows 7 Pro 64ビットでこれらすべてを実行しています...
前もって感謝します、