如果 class 数组中的向量是动态的 push_backed,内存如何工作?
How memory works if vectors inside class array are dynamically push_backed?
假设我们有以下 class:
class Test {
public:
Test() {}
std::vector<int>& getIntList() {
return intList;
}
private:
std::vector<int> intList;
};
此外,我们在 main 函数中有以下代码来声明 class 数组:
int main(void) {
Test* test[20];
for (int i = 0; i < 20; ++i) {
test[i] = new Test();
}
}
在这些情况下,测试对象被实例化。
现在,如果我在每个 class 随机添加向量中的多个项目,
在调整内存大小时,每个 class 中每个向量的内存地址范围可能会发生冲突。
在这种情况下,是否将整个'test'对象复制到其他内存区域并调整向量大小?
或者,向量 STL 是否仅在 class 引用向量时复制到其他内存区域并调整大小?
总而言之,这样编码不是个好主意吗?
考虑这个例子:
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-style 数组的第一个元素,或者单个 int
。
假设我们有以下 class:
class Test {
public:
Test() {}
std::vector<int>& getIntList() {
return intList;
}
private:
std::vector<int> intList;
};
此外,我们在 main 函数中有以下代码来声明 class 数组:
int main(void) {
Test* test[20];
for (int i = 0; i < 20; ++i) {
test[i] = new Test();
}
}
在这些情况下,测试对象被实例化。
现在,如果我在每个 class 随机添加向量中的多个项目,
在调整内存大小时,每个 class 中每个向量的内存地址范围可能会发生冲突。
在这种情况下,是否将整个'test'对象复制到其他内存区域并调整向量大小? 或者,向量 STL 是否仅在 class 引用向量时复制到其他内存区域并调整大小?
总而言之,这样编码不是个好主意吗?
考虑这个例子:
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-style 数组的第一个元素,或者单个 int
。