我对使用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
吗?或者由于子obj
对象的重新分配而重新分配std::vector
?
我希望我解释了我的疑问。 谢谢你的时间。
答案 0 :(得分:7)
不,您的obj
变量永远不会重新分配,因为其中的成员会发生变化。向量有自己的数据指针,并在内部处理它自己的所有分配和重新分配。
以这种方式思考:通常将局部变量(包括完整结构和数组)放在当前函数的堆栈中。编译器通过基址的偏移量访问这些变量。如果编译器(或系统)突然开始在内存中移动变量,它会使变量访问相当复杂,并且还会影响程序的运行时速度和效率。因此局部变量位于堆栈中,并保持编译器放置的位置。在堆上分配的数据(如std::vector
内的数据)可以很容易地移动,因为所有必须在指向数据的指针中更新,就像我之前所说的那样,它们都在向量对象内部处理所以无论如何你什么都不会注意到。