4

我对使用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==&objfor循环的末尾吗?还是obj因为子std::vector对象的重新分配而重新分配?

我希望我能解释我的疑问。谢谢你的时间。

4

1 回答 1

7

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

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

于 2013-08-13T09:35:15.943 回答