我经常遇到这样一种情况:我知道std::vector
在工作之后会包含最多的元素;比方说10000.但它可以很容易地包含更少的元素,例如100。没有办法告诉有多少元素得到.emplaced_back(...)
。
当然,如果有10000个强制回调,则向量将重新分配几次。但如果只插入100个元素,则更少。
我的问题是,将.reserve(10000)
称为坏事?分配内存需要"线性"工作或甚至是不变的,因此即使不使用大部分矢量也不会产生负面影响?如果是这种情况需要考虑哪些要点?
注意:
我前段时间做了一些分析,结果是使用reserve(someIntermediateNumer)
- 可能有优势。然而,结果并不是真正的结论,因为我的程序并不是真正的确定性(我在实际代码上测试过)。我对此的兴趣部分也与理论有关。
答案 0 :(得分:1)
在std :: vector中,reserve(< large number>)不会做多于reserve(< small number>)的工作。在这两种情况下,都执行单个内存分配。负面影响是在其他地方;例如因为你的应用程序使用了更多内存,所以可能会导致某些时候进行交换。
答案 1 :(得分:0)
std :: vector性能可能取决于您的特定内存分配器。假设linux,它可能是单个系统调用,甚至某些实现的所有用户空间都取决于当前可用的内存。内核方面可能不同,因为缓存中已有很小的内存块,而大尺寸则需要sbrk或mmap的额外竞技场。最重要的是,页面错误和交换可能更有可能影响更大的块,但这些将在以后使用时发生。
并注意以上所有假设保留确实是请求记忆。因为某些实现可能已经在构造函数中分配了足够的空间来忽略您的请求。