jma*_*erx 18 c++ heap memory-management
我对GTA IV等游戏可能使用的内存管理类型感兴趣,因为它需要非常快速地创建和删除大量对象.如何避免碎片堆和其他东西.如果有人能指出我正确的方向,我真的很感激.
虽然本文没有具体涉及游戏,但它提供了一种很好的综合,即人们经常在C和C++应用程序中使用的那种自定义内存分配器,以试图提高性能(这是一个警示故事).
重新考虑定制内存分配,Berger,Zorn&McKinley,OOPSLA 2002
希望实现性能改进的程序员经常使用自定义内存分配器.这项深入研究检查了八个使用自定义分配器的应用程序.令人惊讶的是,对于其中六个应用程序,最先进的通用分配器(Lea分配器)的性能与自定义分配器相同或更好.这两个例外使用区域,提供更高的性能(改进高达44%).区域还减少了程序员的负担并消除了内存泄漏的来源.但是,我们表明程序员无法在区域内释放单个对象会导致内存消耗大幅增加.更糟糕的是,这种限制排除了将区域用于常见的编程习语,从而降低了它们的用途.我们提出了我们称之为收益的通用和基于区域的分配器的概括.Reaps是区域和堆的组合,提供了全方位的区域语义,并添加了单个对象删除.我们证明了我们的reaps实现提供了高性能,优于其他具有类似区域语义的分配器.然后,我们使用案例研究来证明实践中收益的空间优势和软件工程优势.我们的结果表明需要快速区域的程序员应该使用收益,并且大多数考虑自定义分配器的程序员应该使用Lea分配器.
malloc多线程实现有两个非常好的实现:
tcmalloc:由谷歌jemalloc:Apache使用(例如)这是Facebook关于改善jemalloc的文章.它在当前最高答案中比Hoard的内存分配器快了约5倍:)
快速创建和销毁大量对象并不一定意味着堆碎片.通常,如果对象具有相同的大小,则可以为下一个释放由一个释放的空间.
通常,即使只是作为优化,程序也可能不会释放和删除对象的内存,而是将旧的内容保存在池中,只需抓取一个并覆盖内容即可创建"新"对象.
| 归档时间: |
|
| 查看次数: |
2633 次 |
| 最近记录: |