内存管理 - C++ 中的自定义分配器有什么问题?
memory management - what's wrong with custom allocator in C++?
建议:在编写自己的分配器之前三思而后行
Bjarne通过给出上述建议想说什么?如果我编写自己的分配器,会出现哪些问题?这真的有问题吗?我应该如何克服这些问题?
我和两位同事Ben Zorn和Kathryn McKinley(现在都在微软研究院(一起写了一篇关于这一点的论文(Reconciding Custom Memory Allocation,OOPSLA 2002(。它获得了最具影响力论文奖——以下是引文。
自定义内存管理通常用于系统软件中,目的是降低分配成本并严格控制软件的内存占用。直到2002年,人们还理所当然地认为特定于应用程序的内存分配器优于通用库。Berger、Zorn和McKinley的论文通过一项严格的实证研究证明了这一假设没有充分的依据,并深入探讨了通用分配器优于手工分配器的原因。该论文也因其实证方法论的质量而引人注目。
最初的论文实际上比引文做得更多:这是论文的摘要。所指的Lea分配器构成了Linux分配器的基础。
希望实现性能改进的程序员通常使用自定义内存分配器。这项深入的研究考察了八个使用自定义分配器的应用程序。令人惊讶的是,对于其中六个应用程序,最先进的通用分配器(Lea分配器(的性能与自定义分配器一样好或更好。这两个例外使用的区域提供了更高的性能(提高了44%(。区域还减少了程序员的负担,消除了内存泄漏的根源。然而,我们表明,程序员无法释放区域内的单个对象可能会导致内存消耗的大幅增加。更糟糕的是,这种限制排除了对常见编程习惯用法使用区域,从而降低了它们的有用性。
我们提出了一个通用的和基于区域的分配器的概括,我们称之为reaps。Reap是区域和堆的组合,通过添加单个对象删除,提供了全方位的区域语义。我们展示了reaps的实现提供了高性能,优于其他具有类似区域语义的分配器。然后,我们用一个案例研究来证明reaps在实践中的空间优势和软件工程优势。我们的结果表明,需要快速区域的程序员应该使用reap,而大多数考虑自定义分配器的程序员应该改为使用Lea分配器。
我们最近做了一项后续研究,发现在几个现代应用程序上几乎有完全相同的效果:自定义分配器通常会减慢应用程序的速度。
除了滚动自己的自定义内存分配器通常意味着性能和空间受到影响之外,它还使调试变得更加困难,并意味着你无法驾驭通用分配器的改进浪潮——包括系统提供的分配器和其他分配器,如Hoard和tcmalloc。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- STD ::列表对其分配器参数有什么作用
- 什么是std::分配器,为什么我需要它
- 记忆竞技场和记忆分配器有什么区别?
- 分配器无状态意味着什么?
- 与自定义分配器一起使用的最佳唯一指针是什么
- 如果指定一个值类型不同的分配器,会发生什么情况
- 什么是 vector<char,分配器 > 类型的C++对象<char>,如何使用它?
- 我应该把什么作为分配器传递给std::hash_map
- 处理使用boost::进程间STL兼容共享内存分配器创建的c++对象的正确方法是什么?
- 堆内存 - 在 C++ 中使用 std::分配器而不是 new 有什么优势?
- 存储分配器——它是什么?
- 通过new分配内存和分配器分配内存之间的区别是什么
- GCC为STL使用的默认分配器是什么
- 内存管理 - C++ 中的自定义分配器有什么问题?
- STL分配器复制构造函数需求的目的是什么?