【发布时间】:2016-10-17 12:36:27
【问题描述】:
我经常遇到这样的情况,我知道std::vector 在完成工作后将包含最大数量的元素;假设是 10000。但是它可以很容易地包含更少的元素,例如 100。没有办法知道有多少元素得到.emplaced_back(...)。
当然,如果有 10000 次调用 emplace back,向量将重新分配几次。但如果只插入 100 个元素,那就更少了。
我的问题是,打电话给.reserve(10000) 会是一件坏事吗?分配内存是否需要“线性”工作,或者它甚至是恒定的,因此不会产生负面影响,即使大部分向量没有被使用?如果出现这种情况,需要考虑哪些要点?
注意:
前段时间我做了一些分析,结果使用reserve(someIntermediateNumer) -might- 有优势。然而,由于我的程序并不是真正的确定性(我在真实代码上测试过),因此结果并不是真正具有决定性的。我对此的兴趣部分也与理论有关。
【问题讨论】:
-
你应该对你的运行时行为进行一些统计分析。
-
您是否更有可能拥有较小的较大向量?
-
地址空间有多少溢价?
-
en.cppreference.com/w/cpp/container/vector/reserve 它“最多是线性的”。如果您不关心“浪费”的内存,它不会受到伤害。
-
除非您需要恢复内存,否则不要费心缩小以适应。无论如何,它可能不会做任何事情。