尽管有一个int的向量,为什么结构的常量大小

时间:2013-07-08 14:12:32

标签: c++ struct sizeof

我已经定义了一个包含整数向量的结构。然后我在向量中插入10个整数并检查struct的大小。但我认为没有区别。

这是我的代码:

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

为什么会这样?结构的大小不应该增长吗?

2 个答案:

答案 0 :(得分:10)

vector将其元素存储在动态分配的内存中(在堆上)。在内部,此可能表示为:

T* elems;        // Pointer memory.
size_t count;    // Current number of elements.
size_t capacity; // Total number of elements that can be held.

因此,sizeof(std::vector)在计算sizeof包含的成员时所包含的元素数量不受影响(在此简单示例中大致为sizeof(T*) + (2 * sizeof(size_t)))。

答案 1 :(得分: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`?