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
会,这应该是一个提示…?@MikeCATreserve
不会初始化分配内存中的任何内容。
void reserve(size_type n);