结构内部的c++向量

c++ vector inside a structure

本文关键字:向量 c++ 内部 结构      更新时间:2023-10-16

我对使用std::vector有点怀疑。如果我得到一个具有std::vector对象的结构,该对象在内存中具有未定义的空间,如果它需要重新分配(std::vector),该结构是否也被重新分配?还是仅std::vector

例如:

struct cluster{
    int a;
    int b;
    struct cluster* parent;
    vector<struct cluster> children;
}
struct cluster obj = {2,1,...};
struct cluster *pobj = &obj;
for(int i = 0; i < 100 ; i ++){
    children.push_back(i); //The capacity will be increased progressly, no?
}

那么,问题是:pobj==&obj是否处于for循环的末尾?还是因为子std::vector对象的重新分配而重新分配了obj

我希望我能解释我的疑虑。谢谢你抽出时间。

不,您的obj变量永远不会被重新分配,因为它内部的成员会发生变化。向量有自己的指向数据的指针,并在内部处理所有自己的分配和重新分配。

这样想:通常局部变量(包括完整的结构和数组)被放在当前函数的堆栈上。编译器通过基地址的偏移量访问这些变量。如果编译器(或系统)突然开始在内存中移动变量,这将使变量访问变得相当复杂,并且还会极大地影响程序的运行速度和效率。所以局部变量在堆栈上,并停留在编译器放置它们的位置。堆上分配的数据(比如std::vector中的数据)可以很容易地四处移动,因为所有这些都必须在指向数据的指针中更新,就像我之前说过的,所有这些都在向量对象中进行内部处理,所以无论如何你都不会注意到。