乘以2的效率

时间:2013-03-30 15:36:32

标签: c++ allocation

我应该以几何方式分配内存并将初始大小设置为1000.当填充它时,它将扩展到2000,4000,依此类推。

我的问题是:如果我将初始大小设置为乘以2,即1024,那么它在效率或任何其他方面会有所不同吗?

请不要谈论分配的向量和替代方法,这只是理论上的。

3 个答案:

答案 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字节等

您还将运行具有大量不同分配的更长会话,以查看块大小是否会影响内存碎片。

当然,我不知道这是否(仍然)适用于您的系统。