我已经定义了一个包含整数向量的结构.然后我在向量中插入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))).
所述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)