如何解决vector :: reserve和经典内存分配之间的内存分配差异
我知道向量和动态内存分配都在使用堆。
char *n = new char[5000000000];
我可以看到分配的内存增加了大约700mb。
vector<char> v;
v.reserve(5000000000);
,在这种情况下,它增加了超过4GB。
两种方法之间有区别吗?
解决方法
以下所有标准参考文献均引用N4659: March 2017 post-Kona working draft/C++17 DIS。
void reserve(size_type n);
效果:伪指令,通知
vector
计划中的大小更改,以便它可以相应地管理存储分配。后reserve()
,capacity()
大于或等于reserve
(如果发生重新分配);并等于之前的值capacity()
否则。仅当且仅当此时发生重新分配 如果当前容量小于reserve()
的参数。如果 除了a的move构造函数之外,还会引发异常 非CopyInsertable
类型,则没有效果。
给定的(编译器)实现可以自由实施自己的(通常为摊销后的)增长策略,并且在分析std::vector
对象增长时可以使用的唯一保证是调用capacity()
之后reserve()
将更大或等于为reserve()
函数传递的参数。即,即使实现可以通过一些聪明的程序分析意识到,分配的存储的某些部分将永远不会使用,但是不允许实现分配的少于的数量。 / p>
但是,当使用 new-expression 分配内存时,有许多特殊规则(由[expr.new]/10到[expr.new]/12约束), allow 实施者在执行 new-expression 产生的分配方面具有更大的自由度;例如来自[expr.new]/10 [摘录]:
允许实现忽略对可替换全局变量的调用 分配函数([new.delete.single],[new.delete.array])。什么时候 这样做,存储由实现提供,或者 通过扩展另一个 new-expression 的分配来提供。的 实现可以将 new-expression
,则为新表达式e1
的分配扩展为 如果[...]e2
提供存储
根据特定程序的上下文,这可以解释为什么与new char[5000000000]
调用相比,v.reserve(5000000000)
表达式的结果看到的动态内存占用空间较小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。