结构中的c ++向量

Bar*_*o91 4 c++ vector realloc

我对使用有疑问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?
}
Run Code Online (Sandbox Code Playgroud)

所以,问题是:是pobj==&objfor循环结束?或者obj由于子std::vector对象的重新分配而重新分配?

我希望我解释了我的怀疑.谢谢你的时间.

Som*_*ude 7

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

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

  • 虽然你的解释是好的,但你应该指出,在编写时,他的代码有不确定的行为.(如果你使用通常的`-D_GLIBCXX_CONCEPT_CHECKS`,它不会用g ++编译.) (3认同)