2010-12-12 3 views
0

std :: vectorのインスタンスが占めるバイト数を理解しようとしています。次のコード:C++でベクトルインスタンスが占有する領域を理解する

vector <int>uno; 
    uno.push_back(1); 
    uno.push_back(1); 
    cout <<"1: "<< sizeof(uno)<<" bytes"<<endl; 
    cout << endl; 

    vector <bool>unos; 
    unos.push_back(true); 
    cout <<"2: "<< sizeof(unos)<<" bytes"<<endl; 
    cout << endl; 

が私にこの出力を与える:

1:12バイト

2:20バイト

vector<bool>のサイズがよりバイト以上を持っている理由は、誰かが私に説明できますが?vector<int>?そして、ベクトルインスタンスのバイト単位のサイズを測定する正しい方法は何ですか...ベクトルの各メンバのサイズを追加することによって? C++で

答えて

4

sizeofオペレータは、コンパイル時に評価常にあり、(vector<T>vector<bool>ような特殊でない限り)ので、すべてvector<T>が同じサイズを有することになります。

12バイトについて疑問がある場合は、おそらく3つのポインタのサイズ、あるいはポインタと要素の数と容量のサイズです。実際のデータは決してvectorの内部に格納されません。

あなたは良い近似である、合計を使用しているどのくらいのメモリを知りたい場合は、次の

sizeof(std::vector<T>) + my_vector.capacity() * sizeof(T) 

それは考慮に入れ、ヒープ上の簿記のデータを取ることはありませんので、これは唯一の近似値です。

+2

+1:ベクトルは特殊化されているため大きいです。 – Puppy

+0

ベクターの場合、ヒープ上の追加のブックキープの必要はありません。 –

+0

@kot:あなたが何を意味するか分かりません。すべてのヒープ割り当てには、インプリメンテーションに固有の*目に見えないブックキーピングデータがあります。 – fredoverflow

3

std::vector<bool>は、std::vector<int>より複雑であるため大きいです。現在のC++標準では、vector<bool>のデータをビットパックする必要があります。これにはいくつかの追加の簿記が必要で、通常のstd::vector<T>とは若干異なる動作をします。

この異なる動作std::vector<bool>は、今後のC++ 0x標準では削除される可能性が非常に高いです。

+0

私は願っています。しかし今のところ、委員会はそれを維持することに投票しており、実際にそれについて何かすることについてコンセンサスがないようです。私はそれがここにあると思う。 – jalf

+0

それは失望です。 –

関連する問題