我记得在一本关于电脑游戏编程的书中读到,遗憾的是记不起头衔。提高性能的一种简单方法是在开始时做这样的事情:
int main()
{
{
char dummy* = new char[10000000]; // 10Mbytes ish
delete[] dummy;
}
...
}
这个想法是动态内存分配的昂贵部分是从OS获取内存的请求,通常在程序结束之前不会返回。有没有人使用过这个并且看到了性能改进?
答案 0 :(得分:4)
这是否有效取决于相关操作系统。许多现代操作系统使用mmap进行大量内存分配并完全绕过进程堆。这意味着将直接从OS进行分配,然后在释放时直接返回到OS。
更好的策略是通常在开始时进行内存分配,并在将内存返回堆之前尽可能多地重用已分配的空间。这是STL分配器背后的逻辑。
答案 1 :(得分:3)
这没有意义。你分配一个巨大的块,然后释放它,并且堆取得了块所占用的内存的所有权,并且可以在以后使用时合法地将其分段。
答案 2 :(得分:1)
这并不一定能提高性能,因为当前的标准没有说明如何动态分配,解除分配然后重新分配内存。但是,只要需要分配内存,实现就可以在程序的其余部分中使用相同的内存区域。它更像是内存池。
一切皆有可能。这完全取决于实施。它甚至可以选择完全删除代码,因为它什么都不做。
答案 3 :(得分:1)
根据您的环境,可能存在允许您指定初始堆大小的加载程序标志。当程序加载到内存中时,将分配此内存,因此它将成为启动时间的一部分。这应该给出相同的结果,这样做的好处是编译器不会优化它。