std::vector构造函数与reserve方法的区别及堆内存分配疑问
两段C++ vector代码的区别与内存分配说明
代码核心区别
- 元素状态与容量/尺寸:
std::vector<uint8_t> vec1(size);:直接创建一个包含size个uint8_t元素的vector,所有元素会被值初始化为0。此时vec1.size()等于size,vec1.capacity()至少为size。std::vector<uint8_t> vec2; vec2.reserve(size);:先创建空vector,再调用reserve(size)预分配能容纳至少size个元素的内存,但不会生成任何元素。此时vec2.size()为0,vec2.capacity()至少为size。
- 访问与使用差异:
- vec1可以直接通过下标(如
vec1[0])访问任意位置的元素,因为元素已存在。 - vec2不能直接下标访问(无元素),必须通过
push_back、emplace_back等方法添加元素,当元素总数达到size前不会触发额外内存分配。
- vec1可以直接通过下标(如
内存分配情况
两段代码都会在堆上分配内存(默认分配器下):
- vec1在初始化阶段就从堆上分配足够容纳
size个元素的内存,同时完成元素的构造初始化。 - vec2调用
reserve(size)时,会从堆上分配至少能容纳size个元素的内存,但不会构造元素。
内容的提问来源于stack exchange,提问作者mewo1234
相关产品推荐
相关产品推荐

