EffectiveC++ | 50了解new和delete的合理替换时机
条款50:了解new和delete的合理替换时机
文章目录
- 条款50:了解new和delete的合理替换时机
-
- 3个常见理由替换编译器提供的 operator new 或 operator delete
- 使用开发源码的内存管理器
- 请记住
3个常见理由替换编译器提供的 operator new 或 operator delete
-
用来检测运用上的错误。operator new 持有一串动态分配所得地址,而 operator delete 将地址从中移走。如果自定义 operator new, 便可分配超额内存,在额外空间放置特定byte pattern(即签名, signatures)。operator delete 便得以检查上述签名是否原封不动,若否就表示在分配区的某个生命时间点发生了“overruns”(写入点在分配区块尾部之后)或“unferruns”(写入点在分配区块头部之前),operator delete 可以志记(log)那个实事以及那个指针。
-
为了强化效能。编译器提供的 operator new 和 operator delete 必须接纳各种分配形态,范围从程序存活期间的少量区块动态分配,到大数量短命对象的持续分配和归还。它们还必须考虑破碎问题,最终导致程序无法满足大区块内存要求,即使彼时有总量足够但分散为许多小区块的自由内存。效率比较低下。
-
为了收集使用上的统计数据。自定义operator new 或 operator delete可以收集分配区块的大小分布、内存寿命、内存分配和归还的次序、运用形态是否随时间改变等。
使用开发源码的内存管理器
Boost 程序库的Pool 就是一个分配器,对于常见的“分配大量小型对象”很有帮助
齐位也是一个细节,TR1 支持各类型特定的对其条件,很值得注意。
本条款的主题是,了解何时可在"全局性的"或"class专属的"基础上合理替换缺省的new和delete:
-
为了检测运用错误(如前所述)。
-
为了收集动态分配内存的使用统计信息(如前所述)。
-
为了增加分配和归还的速度。
-
为了降低缺省内存管理s器带来的空间额外开销。
-
为了弥补缺省分配器中的非最佳齐位。
-
为了将相关对象成簇集中。降低“内存页错误”(page fault)的频率,new/delete的“placement版本”(条款52)有可能完成。
-
为了获得非传统的行为。
请记住
- 有许多理由需要写个自定的 new 和 delete,包括改善性能,对 heap 运用错误进行调用,收集 heap 使用信息。