C++ vector::reserve与经典内存分配之间的内存分配差异

C++ vector::reserve与经典内存分配之间的内存分配差异,c++,vector,std,heap-memory,C++,Vector,Std,Heap Memory,我知道向量和动态内存分配都使用堆 char*n=新字符[5000000000] 我可以观察到分配的内存增加了约700mb vector<char> v; v.reserve(5000000000); 向量v; v、 准备金(5000000000); 在这种情况下,它增加了4GB以上 这两种方法之间有区别吗?下面的所有标准参考文献都引用了 发件人: 效果:一个指令,通知向量计划的大小更改,以便它可以相应地管理存储分配。之后 reserve(),capacity()

我知道向量和动态内存分配都使用堆

char*n=新字符[5000000000]

我可以观察到分配的内存增加了约700mb

    vector<char> v;
    v.reserve(5000000000);
向量v; v、 准备金(5000000000);
在这种情况下,它增加了4GB以上

这两种方法之间有区别吗?

下面的所有标准参考文献都引用了


发件人:

效果:一个指令,通知
向量
计划的大小更改,以便它可以相应地管理存储分配。之后
reserve()
capacity()
大于或等于
重新分配时保留
;并且等于的上一个值
capacity()
否则。如果且仅当 如果当前容量小于
reserve()
的参数。如果 异常不是由 不可插入复制的类型,没有效果

给定的(编译器)实现可以自由地实现自己的(通常是摊销的)增长策略,在分析
std::vector
对象增长时,我们可以使用的唯一保证是调用
reserve()后的
capacity()
将大于或等于为
reserve()
函数传递的参数。也就是说,一个实现不允许分配的少于提供的(请求的)参数,即使它可以通过一些巧妙的程序分析意识到,分配的存储的一部分永远不会被使用

然而,当使用新表达式分配内存时,有许多由through管理的特殊规则,允许实现者在如何执行由新表达式产生的分配方面有更大的自由度;e、 g.摘自[摘录]:

允许实现省略对可替换全局变量的调用 分配函数([new.delete.single],[new.delete.array])。当它 如果执行此操作,则存储由实现或提供 通过扩展另一个新表达式的分配来提供。这个 实现可以将新表达式
e1
的分配扩展到 为新表达式提供存储
e2
if[…]


根据特定程序的上下文,这可以解释为什么与
v.reserve(5000000000)
调用相比
new char[5000000000]
表达式的结果动态内存占用更小。

new
不会初始化分配的缓冲区(因为
char
是基元类型)而
vector
会,这应该是一个提示…?@MikeCAT
reserve
不会初始化分配内存中的任何内容。
void reserve(size_type n);