2015-12-01 2 views
22

私はちょうどベクトルと構造体について学び、ある時点で、ベクトルのサイズをバイト単位で出力しようとしました。ここでは、コードです:ベクトルのC++サイズは24ですか?

#include <iostream> 
#include <vector> 

struct Foo{ 
    std::vector<int> a; 
}; 

int main() 
{ 
    using std::cout; using std::endl; 

    Foo* f1 = new Foo; 

    f1->a.push_back(5); 
    cout << sizeof(f1->a) << endl; 
    cout << sizeof(f1->a[0]) << endl; 

    delete[] f1; 
} 

出力は244です。

明らかに、2行目がintのサイズであるため、4が出力されます。しかし、なぜ他の価値24が正確にあるのですか?ベクトルは24バイトのメモリを占有していますか?ありがとう!

std::vector
+9

を開始します](http://stackoverflow.com/questions/30422205/why-the-libc-stdvector-internally-keeps-three-pointers-instead-of-one-pointe) – jaggedSpire

+1

これは 'class std :: vector のサイズです'。これは実装に依存し、そのようなクラスのメンバのサイズの合計です。通常、基になるCスタイルの配列へのポインタ、サイズ、容量などのさまざまなメンバー。 – Banex

+3

注意: 'delete [] f1'は間違っています、それは' delete f1'だけです –

答えて

36

のパブリックインターフェースは、標準によって定義されているが、異なるあり得る実装:換言すれば、std::vectorのボンネットの下に何があるか、実装から変更することができます。

std::vectorの内部構造は、リリースビルドとデバッグビルドから変更することができます(たとえば、特定のバージョンのVisual C++に付属するSTL実装など)。

表示される24のサイズは、3つのポインタ(各ポインタは64ビットアーキテクチャでは8バイトのサイズなので、3 x 8 = 24バイトです)と説明できます。これらのポインタは指定できます

  • は、ベクターは通常、[3つのポインタを用いて実装され、ベクターのために確保されたメモリのベクトル
  • 最後のベクトル
  • 最後の(すなわち、ベクトルの容量
+0

48ビットポインタ、SSO、カスタムアロケータでスマートにしようとするソリューションに追加してくださいそのサイズは、20〜64バイトの間の任意の場所に、ヒープに割り当てられているものに加えて合理的になります。 – Peter

+1

偶数16バイトも現実的です。開始位置への8バイトのポインタ、4バイトの要素_count_、4バイトの予約。 – MSalters