我经常遇到这样的情况,我知道一个std::vector在完成工作后,将包含最大数量的元素;比如说10000个。然而,它可以轻松地包含更少的元素,例如100个。没有办法知道有多少元素得到了.emplaced_back(...)。
当然,如果有10000个调用需要重新部署,向量将重新分配几次。但如果只插入100个元素,就会少得多。
我的问题是,调用.reserve(10000)会是一件坏事吗?分配内存是否需要“线性”工作,或者它是不变的,因此不会有负面影响,即使向量的很大一部分没有被使用?如果这种情况下,需要考虑的要点是什么?
注意:前段时间我做了一些分析,结果是使用reserve(someIntermediateNumer) -可能-有好处。然而,结果并不是真正确定的,因为我的程序并不是真正确定的(我在真实的代码上进行了测试)。我对此的兴趣在一定程度上也与理论有关。
发布于 2016-10-17 20:59:32
在std::vector中,保留(< large number >)并不比保留(< small number >)做更多的工作。在这两种情况下,都会执行一次内存分配。负面影响在其他地方;例如,因为您的应用程序使用了更多的内存,它可能会在某个时候导致交换。
发布于 2016-10-18 02:40:52
vector的性能可能取决于您特定的内存分配器。假设linux,它可以是单个系统调用,甚至是某些实现的所有用户空间,这取决于当前可用内存。内核端可能会有所不同,因为缓存中很可能已经存在较小的内存块,而较大的内存块将使用sbrk或mmap请求额外的内存空间。最重要的是,页面错误和交换更有可能影响更大的块,但这些都会在以后使用时发生。
并注意以上所有假设预留确实是请求存储器。因为一些实现可能已经在构造函数中分配了足够的空间来忽略您的请求。
https://stackoverflow.com/questions/40086562
复制相似问题