4

整数のベクトルを含む構造体を定義しました。次に、ベクトルに 10 個の整数を挿入し、構造体のサイズを確認します。しかし、違いはありません。

これが私のコードです:

struct data
{
  vector<int> points;
}

int main()
{
  data d;
  cout << sizeof(d) << endl;
  for (int i=0; i< 10; ++i)
    d.points.push_back(i)
  cout << sizeof(d) << endl;

どちらの場合も、同じ結果が得られます: 16

なぜそうなのですか?構造体のサイズを大きくするべきではありませんか?

4

2 に答える 2

7

sizeof演算子は、格納された要素のサイズを含まない、コンテナーを維持するために使用されるデータ構造のサイズを提供するコンパイル時の操作です。

これは最初はあまり直感的ではないように思えるかもしれませんが、 を使用するときは、実際のデータを保持する別の領域へのポインターを保持するstd::vector少量のローカルストレージ (が作成される場所) を使用していることを考慮してください。std::vectorベクトルが大きくなるとデータ ブロックも大きくなりますが、制御構造は変わりません。

sizeof有効期間中に変更されないという事実は重要です。これは、コンパイラが他の可能なメンバーに干渉することなく、points内部にスペースを割り当てることができることを確認する唯一の方法であるためです。data

struct data2 {
  int x;
  std::vector<int> points;
  int y;
};

オブジェクト (この場合) のサイズが大きくなることが許可されている場合、その場所に依存する可能性のあるコードを壊すstd::vectorために割り当てられたスペースを超えて拡大します。y

data2 d;
int *p = &d.y;
d.points.push_back(5);
// does `p` still point to `&d.y`? or did the vector grow over `y`?
于 2013-07-08T14:20:42.753 に答える