c++ - 如果类数组中的向量被动态 push_backed,内存如何工作?
问题描述
假设我们有以下类:
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>)
恒定的。
当向量的增长foo
时,实例的大小不会增加。size()
它类似于拥有一个动态数组(仅用于示例):
struct bar {
int* c_array;
};
在这里,sizeof(bar)
可能只是sizeof(int*)
,因为它只是一个指针,即使它可以指向 c 样式数组的第一个元素,或者指向单个int
.
推荐阅读
- java - 在android java中运行另一个函数之前,将图像上传到firestore存储的等待函数如何完成?
- mysql - 为什么在 typeorm 中更新实体后调用 delete?
- .net-core - 在调用 IPublicClientApplication.AcquireTokenInteractive(...WithPrompt) 的 .NET Core 3.1 WPF 桌面应用程序中,是否可以创建自定义弹出窗口?
- python - 即使有记忆,我的程序也不能运行得那么快
- android - 清单:缺少必需的属性:autoRevokePermissions
- c# - 运行时出现错误 CS1002 - Markdown 解析器(仅限标题)
- python - 从 DF 获取数据以放入主 DF
- amazon-ec2 - AWS RDS CPU 利用率高
- apache-kafka - 使用 Java AdminClient 更改动态默认代理配置
- variables - 任何解决方案都必须一直滚动到程序顶部以检查声明的变量?