4

ベクトルのベクトルのメモリ内のサイズを推定しようとしていますが、正しい概算が得られないようです。

チェックするために書いた小さなコードは次のとおりです。

#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ビットでこれらすべてを実行しています...

前もって感謝します、

4

1 に答える 1

3

2 番目のケースでは、すべてのn * m要素が でありvector<int>、動的に割り当てる必要があります。このような動的割り当てにはそれぞれオーバーヘッドがあります。32 ~ 64 バイトのオーバーヘッドを持つ動的割り当てを見つけることは珍しくありません。これは、「不足している」バイトの理由の一部である可能性が高いです。

于 2013-08-20T13:45:21.360 に答える