我已经定义了一个包含整数向量的结构。然后我在向量中插入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
为什么会这样?结构的大小不应该增长吗?
答案 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`?