如果类数组中的向量是动态推入后退的,内存将如何工作?

sun*_*cho 1 c++ class vector memory-reallocation

假设我们有以下课程:

class Test {
public:
   Test() {}
   std::vector<int>& getIntList() {
      return intList;
   }
private:
   std::vector<int> intList;
};
Run Code Online (Sandbox Code Playgroud)

同样,我们在main函数中有以下代码来声明类数组:

int main(void) {
   Test* test[20];

   for (int i = 0; i < 20; ++i) {
      test[i] = new Test();
   }
}
Run Code Online (Sandbox Code Playgroud)

在这些情况下,将实例化测试对象。

现在,如果我在每个类中的向量中随机添加多个项目,

在调整其内存大小的同时,可能会碰撞每个类中每个向量的内存地址范围。

在这种情况下,是否将整个“测试”对象复制到其他存储区中,并调整矢量的大小?或者,向量STL是仅在类引用向量时才复制到其他存储区并调整大小吗?

完全地,这样编码不是一个好主意吗?

for*_*818 8

考虑以下示例:

struct foo {
    std::vector<int> x;
    std::vector<int> y;
};
Run Code Online (Sandbox Code Playgroud)

现在sizeof(foo)是一个编译时间常数。将元素添加到向量时,它不会改变。也是sizeof(std::vector<int>)恒定的。

向量的foo增大时,实例的大小不会增加size()。它类似于具有动态数组(仅出于示例目的):

struct bar {
   int* c_array;
};
Run Code Online (Sandbox Code Playgroud)

在这里,sizeof(bar)可能是正义的sizeof(int*),因为它只是一个指针,即使它可以指向c样式数组的第一个元素,也可以指向一个int