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

bha*_*esh 4 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;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我得到了相同的结果:16

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

hmj*_*mjd 10

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

T* elems;        // Pointer memory.
size_t count;    // Current number of elements.
size_t capacity; // Total number of elements that can be held.
Run Code Online (Sandbox Code Playgroud)

因此,在sizeof(std::vector)计算sizeof其包含的成员时,它不受其包含的元素数量的影响(在这个简单的例子中sizeof(T*) + (2 * sizeof(size_t))).


Dav*_*eas 7

所述sizeof操作者是一个编译时间动作,让你用于维持容器中,不包括所存储的元件的尺寸的数据结构的大小.

虽然这一开始可能看起来不太直观,但考虑到当你使用a时,std::vector你正在使用少量的本地存储(std::vector创建它的地方),它保存指向保存实际数据的不同区域的指针.当向量增长时,数据块将增长,但控制结构仍然相同.

sizeof在它的生命周期中不会改变的事实很重要,因为它是确保编译器可以为points内部分配空间data而不干扰其他可能成员的唯一方法:

struct data2 {
  int x;
  std::vector<int> points;
  int y;
};
Run Code Online (Sandbox Code Playgroud)

如果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`?
Run Code Online (Sandbox Code Playgroud)