使用新的删除技巧防止内存碎片

时间:2011-02-17 13:40:01

标签: c++ memory-management

我记得在一本关于电脑游戏编程的书中读到,遗憾的是记不起头衔。提高性能的一种简单方法是在开始时做这样的事情:

int main()
{
 {
   char dummy* = new char[10000000];  // 10Mbytes ish
   delete[] dummy;
 }
 ...
}

这个想法是动态内存分配的昂贵部分是从OS获取内存的请求,通常在程序结束之前不会返回。有没有人使用过这个并且看到了性能改进?

4 个答案:

答案 0 :(得分:4)

这是否有效取决于相关操作系统。许多现代操作系统使用mmap进行大量内存分配并完全绕过进程堆。这意味着将直接从OS进行分配,然后在释放时直接返回到OS。

更好的策略是通常在开始时进行内存分配,并在将内存返回堆之前尽可能多地重用已分配的空间。这是STL分配器背后的逻辑。

答案 1 :(得分:3)

这没有意义。你分配一个巨大的块,然后释放它,并且堆取得了块所占用的内存的所有权,并且可以在以后使用时合法地将其分段。

答案 2 :(得分:1)

这并不一定能提高性能,因为当前的标准没有说明如何动态分配,解除分配然后重新分配内存。但是,只要需要分配内存,实现就可以在程序的其余部分中使用相同的内存区域。它更像是内存池。

一切皆有可能。这完全取决于实施。它甚至可以选择完全删除代码,因为它什么都不做。

答案 3 :(得分:1)

根据您的环境,可能存在允许您指定初始堆大小的加载程序标志。当程序加载到内存中时,将分配此内存,因此它将成为启动时间的一部分。这应该给出相同的结果,这样做的好处是编译器不会优化它。