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

10

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

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)))。

于 2013-07-08T14:15:42.560 回答
7

运算符是一个编译时操作,sizeof它为您提供用于维护容器的数据结构的大小,不包括存储元素的大小。

虽然一开始这似乎不太直观,但考虑到当您使用 a 时,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 回答