若std::vector::resize始终在初始容量范围内,是否会改变容量或触发内存重分配?
问题:当调用std::vector::resize()时,若调整后的大小始终不超过初始预留的容量,是否会改变vector的capacity(),或触发内存重分配?
使用场景
#include <vector> const uint64_t maxSize = /* some large size */; // SimpleCStruct是包含基础C类型及其他固定大小C结构体的固定大小C结构体 std::vector<SimpleCStruct> v; v.reserve(maxSize); SimpleCStruct * const dataPtr = v.data(); // 必须在下方循环开始前保存 for( /* 大量迭代 */ ) { const uint64_t numberOfElementsWritten = C_function_writes_data_to(dataPtr); v.resize(numberOfElementsWritten); // numberOfElementsWritten < maxSize(始终成立) // 此处将'v'序列化到磁盘 }
回答
在该场景下,既不会改变vector的capacity(),也不会触发内存重分配,原因如下:
- 当
resize(n)的n小于当前size()时:仅调整内部元素计数(size),底层内存完全不受影响,容量保持不变,符合cppreference中“调整为更小大小时,vector容量绝不会减少”的描述。 - 当
resize(n)的n大于当前size()但小于等于capacity()时:仅会构造新增的元素(针对非POD类型),但不会重新分配内存——因为预留的容量已经足够容纳n个元素,无需扩容。
结合你的场景来看,提前调用reserve(maxSize)已经确保vector的容量至少为maxSize,而循环中numberOfElementsWritten始终小于maxSize,因此无论resize是增大还是缩小元素数量,都不会触发内存重分配,capacity()会维持在不小于maxSize的状态,你提前保存的dataPtr也会始终有效,不会因resize操作失效。
内容的提问来源于stack exchange,提问作者S.V
相关产品推荐
相关产品推荐

