gpt4 book ai didi

c++ - vector::reserve和经典内存分配之间的内存分配差异

转载 作者:行者123 更新时间:2023-12-02 10:10:47 24 4
gpt4 key购买 nike

我知道 vector 和动态内存分配都在使用堆。 char *n = new char[5000000000];我可以看到分配的内存增加了大约700mb。

    vector<char> v;
v.reserve(5000000000);
在这种情况下,它增加了超过4GB。
两种方法之间有区别吗?

最佳答案

以下所有标准引用均引用N4659: March 2017 post-Kona working draft/C++17 DIS

[vector.capacity]/3:

void reserve(size_type n);

Effects: A directive that informs a vector of a planned change in size, so that it can manage the storage allocation accordingly. Afterreserve(), capacity() is greater or equal to the argument ofreserve if reallocation happens; and equal to the previous value ofcapacity() otherwise. Reallocation happens at this point if and onlyif the current capacity is less than the argument of reserve(). Ifan exception is thrown other than by the move constructor of anon-CopyInsertable type, there are no effects.


给定的(编译器)实现可以自由实现自己的(通常为摊销的)增长策略,并且在分析 std::vector对象增长时可以使用的唯一保证是,调用 capacity()之后的 reserve()将等于或大于等于传递给 reserve()函数。也就是说,即使实现可以通过一些聪明的程序分析实现,分配的存储区的一部分将永远不会使用,但不允许实现分配的 小于提供的(要求的)
但是,当使用new-expression分配内存时,有许多特殊规则(由 [expr.new]/10[expr.new]/12支配),使实现者在执行new-expression的分配方式时具有更大的自由度。例如从 [expr.new]/10 [摘录]:

An implementation is allowed to omit a call to a replaceable globalallocation function ([new.delete.single], [new.delete.array]). When itdoes so, the storage is instead provided by the implementation orprovided by extending the allocation of another new-expression. Theimplementation may extend the allocation of a new-expression e1 toprovide storage for a new-expression e2 if [...]


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

关于c++ - vector::reserve和经典内存分配之间的内存分配差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63616759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com