Bjarne Stroustrup在他的“C ++编程语言”一书中说:
建议:在编写自己的分配器之前要三思而后
Bjarne通过提供上述建议想要说些什么?如果我编写自己的分配器,可能会出现哪些问题?这真的有问题吗?我该如何克服这些问题?
答案 0 :(得分:4)
与两位同事Ben Zorn和Kathryn McKinley(现在都在微软研究院)一起,我写了一篇关于这个问题的论文(Reconsidering Custom Memory Allocation,OOPSLA 2002)。它获得了Most Influential Paper Award - 这是引用。
自定义内存管理通常用于系统软件,以降低分配成本并严格控制软件的内存占用。直到2002年,特定于应用程序的内存分配器才优于通用库。 Berger,Zorn和McKinley的论文通过严格的实证研究表明,这种假设并不充分,并且可以深入了解为什么通用分配器可以胜过手工制作的分配器。该论文还突出了其实证方法的质量。
原始论文实际上做的不仅仅是引用:这是论文的摘要。所提到的Lea分配器构成了Linux分配器的基础。
希望实现性能改进的程序员经常使用自定义内存分配器。这项深入研究检查了八个使用自定义分配器的应用程序。令人惊讶的是,对于其中六个应用程序,最先进的通用分配器(Lea分配器)的性能与自定义分配器相同或更好。这两个例外使用区域,提供更高的性能(改进高达44%)。区域还减少了程序员的负担并消除了内存泄漏的来源。但是,我们表明程序员无法在区域内释放单个对象会导致内存消耗大幅增加。更糟糕的是,这种限制排除了将区域用于常见的编程惯用语,从而降低了它们的用途。
我们提出了我们称之为收益的通用和基于区域的分配器的概括。 Reaps是区域和堆的组合,提供了全方位的区域语义,并添加了单个对象删除。我们证明了我们的reaps实现提供了高性能,优于其他具有类似区域语义的分配器。然后,我们使用案例研究来证明实践中收益的空间优势和软件工程优势。我们的结果表明需要快速区域的程序员应该使用收益,并且大多数考虑自定义分配器的程序员应该使用Lea分配器。
我们最近进行了一项后续研究,发现几种现代应用程序几乎完全相同:自定义分配器通常减慢应用程序。
除了滚动自己的自定义内存分配器通常意味着性能和空间受到影响之外,它还使调试变得更加困难,这意味着您无法在通用分配器中进行改进 - 包括系统 - 提供的和Hoard和tcmalloc等其他人。