如果类数组中的向量是动态push_backed的,内存如何工作

How memory works if vectors inside class array are dynamically push_backed?

本文关键字:内存 何工作 工作 backed 数组 向量 push 动态 如果      更新时间:2023-10-16

假设我们有以下类:

class Test {
public:
   Test() {}
   std::vector<int>& getIntList() {
      return intList;
   }
private:
   std::vector<int> intList;
};

此外,我们在 main 函数中还有以下代码来声明类数组:

int main(void) {
   Test* test[20];
   for (int i = 0; i < 20; ++i) {
      test[i] = new Test();
   }
}

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

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

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

在这种情况下,是否将整个"测试"对象复制到其他内存区域并调整矢量大小?或者,向量 STL 是否仅在类引用向量时复制到其他内存区域并调整大小?

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

考虑这个例子:

struct foo {
    std::vector<int> x;
    std::vector<int> y;
};

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

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

struct bar {
   int* c_array;
};

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