我应该以几何方式分配内存并将初始大小设置为1000.当填充它时,它将扩展到2000,4000,依此类推。
我的问题是:如果我将初始大小设置为乘以2,即1024,那么它在效率或任何其他方面会有所不同吗?
请不要谈论分配的向量和替代方法,这只是理论上的。
答案 0 :(得分:5)
Andrew Koenig在1998年的一篇关于缓冲增长策略的面向对象编程期刊上发表了一篇文章。不幸的是,我无法找到该文章的在线副本。
一般而言,指数增长优于固定增长。在指数增长中,优选1.6(或1.5)倍。 Koenig在一篇usenet帖子中讨论了这个原因
http://groups.google.com/group/comp.lang.c++.moderated/msg/ba558b4924758e2e?
技术上有理由偏爱1.5到2 - 更具体地说,是 喜欢小于(1 + sqrt(5))/ 2的值。
假设您正在使用第一个适合的内存分配器,并且您正在逐步使用 附加到矢量。然后每次重新分配时,都会分配新的 记忆,复制元素,然后释放旧记忆。这留下了一个空白,并且 能够最终使用那个记忆会很高兴。如果是矢量 增长太快,对于可用内存来说总是太大了。 事实证明,如果增长因子是> =(1 + sqrt(5))/ 2,则新的记忆 对于那些留下来的洞来说,总是太大了;如果是 <(1 + sqrt(5))/ 2,新的记忆最终会适合。所以1.5足够小 允许内存被回收。
Plauger的vector
的STL实现(由MSVC使用)基于上述内容使用1.5。
许多大C ++人员讨论的完整主题 - http://groups.google.com/group/comp.lang.c++.moderated/browse_frm/thread/6ac1ff5688d6289c/ba558b4924758e2e#ba558b4924758e2e
还有一些文章谈论Koenig在JOOP中的文章。
1)http://www.gotw.ca/gotw/043.htm
有关更多信息,请参阅1998年9月出版的JOOP(面向对象编程期刊)中的Andrew Koenig专栏。 Koenig还说明了为什么一般来说,最佳增长因素不是2,而是大约1.5。
2)http://www10.informatik.uni-erlangen.de/Publications/TechnicalReports/TechRep09-11.pdf
增长策略使用户能够指定指针向量在需要更多元素时如何增长。尽管在大多数情况下,Andrew Koenig [Koe98,Sut07]提出的最佳增长策略应该为大多数场景提供最佳性能,但在某些情况下,不同的方法仍然可以产生影响。
答案 1 :(得分:4)
我认为这与我使用的系统和优化代码无关。但是,它将非常依赖于您使用的操作系统和编译器。正如NPE建议的那样,最好的了解方法是简单的基准代码。
答案 2 :(得分:1)
问题是:为什么你认为使用2的幂是不同的?根据操作系统,使用的内存分配器和其他一些因素,存在差异,唯一合理的方法是根据您的用例对其进行基准测试。
您要测试的是:计算系统每次分配的开销。在某些情况下,当您保留2 的功率减去开销时,内存分配器可能会有所帮助。例如,如果开销是24字节,则从1024-24 = 1000字节开始。如果需要增加它,请使用2048-24 = 2024字节等
您还将运行具有大量不同分配的更长会话,以查看块大小是否会影响内存碎片。
当然,我不知道这是否(仍然)适用于您的系统。