2011-02-17 12 views
4

我记得在一本关于电脑游戏编程的书中读到,抱歉不记得标题。这提高性能一个简单的方法是做这样的事情附近开始:用新的预防内存碎片 - 删除技巧

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

的想法是,动态内存分配的昂贵的部分是让从操作系统,这通常不会得到内存的要求返回到程序结束。有没有人使用过这一点,并看到性能改进?

+3

好,但是与内存碎片的关系在哪里? :) – ypnos 2011-02-17 13:42:26

+1

似乎安置新/内存池?如果我喝醉了,请纠正我。 – DumbCoder 2011-02-17 13:54:53

回答

4

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

一个更好的策略是在将内存返回堆之前,尽可能多地分配开始时的内存分配和尽可能多的重用空间。这是STL分配器的逻辑。

3

这没有意义。您分配一个巨大的块,然后释放它,并且堆占用该块所占用的内存的所有权,并且可以在稍后使用时合法地分割它。

1

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

任何事情都可能发生。它完全取决于实施。它甚至可能选择完全删除代码,因为它什么也不做。

1

根据您的环境,可能会有加载器标志让您指定初始堆大小。当你的程序被加载到内存时,这个内存将被分配,所以它成为启动时间的一部分。这应该给出相同的结果,编译器不会优化它的好处。