如何让std::vector为包含内部std::vector的对象预留内存?
关于std::vector内存预留的疑问
假设有如下结构体:
struct MyObject { int someId; std::vector<int> innerVector; MyObject(int a) { innerVector.reserve(a); } };
当通过如下方式创建并预留std::vector<MyObject>的内存时:
std::vector<MyObject> myObjects; myObjects.reserve(maxItemsToBeAllowed);
由于每个MyObject的innerVector大小不可预测,有两个疑问:
- 外层的
myObjects如何完成内存预留? - 若
innerVector后续扩容至过大,是否会在运行时触发重新分配?
回答
外层vector的内存预留逻辑:
myObjects.reserve(maxItemsToBeAllowed)仅负责预留存储MyObject对象本身的连续内存空间,即能容纳maxItemsToBeAllowed个MyObject实例的内存。每个MyObject里的innerVector本质是一个包含指针、容量、大小的小型结构体(具体实现略有差异),外层vector预留的内存只包含这些innerVector结构体本身,不包含innerVector指向的动态数组内存——那部分内存是每个innerVector独立向堆申请的。innerVector的扩容与重新分配:
会触发运行时重新分配。innerVector的内存管理完全独立于外层的myObjects:- 构造
MyObject时调用的innerVector.reserve(a),只是给当前这个innerVector预留了能存储a个int的空间; - 后续如果向该
innerVector添加元素的数量超过它自身的预留容量(比如push_back了a+1个int),它会按照std::vector的默认扩容规则(通常是容量翻倍)重新分配更大的堆内存,将原有元素拷贝/移动至新内存后释放旧内存,这个过程和外层myObjects是否预留空间没有任何关联。
- 构造
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

