3.17 编写内存安全类
C++面向对象高效编程(第2版)
良好实现的类应该负责管理正确分配内存,无论创建(无论以何种方式创建)和使用了多少对象,都不会引发任何内存(资源)泄漏。设计和实现这样的类并不容易,要理解内存安全类的指导原则,必须先理解无用单元回收(garbage collection)、悬挂引用(dangling reference)和初始化问题。第4章将涵盖这些内容。现在,先来了解一下内存安全类。
3.17.1 改善性能
通过以上对值、指针和引用的讨论,你可能会担心性能问题。如果需要改善类(或一组类)的性能,以下列出的一些指导原则会有所帮助。必须反复强调一点,在编写类的第1个版本的代码时,首要的目标是正确地实现类,不要把注意力集中在性能上。等其他部分都完成妥当后,实际性能测试的结果会指导我们如何改善性能。
记住:
(1)避免制作对象的副本。复制对象的开销很大(在内存和CPU时间方面)。
避免创建新对象,设法复用现有对象。创建(和销毁)对象开销很大。
在适当的时候使用const引用形参。
使用const成员函数。
尽可能地使用初始化语义(而非赋值)。
优先使用指针而不是引用作为数据成员。指针允许惰性求值(lazy evaluation),而引用不允许。在第4章和第二部分的第11章中将做详细介绍。
避免在默认构造函数中分配存储区。要将分配延迟到访问成员时,通过指针数据成员(pointer data member)可轻松完成(见第11章)。
用指针数据成员而不是引用和值成员。
尽可能地使用引用计数(在其他章节深入讨论)。
通过重新安排表达式和复用对象减少临时对象。
(2)在编写代码的最初阶段中避免使用技巧。
坚持安全第一,确保不会出现内存泄漏。
在软件开发的早期阶段,不用担心优化的问题。基于性能评定,再关注这个问题。
在现实世界中,通常认为任何软件都是以速度作为最终评定的标准。许多时候,客户并不关心我们是使用OO技术还是其他什么技术。请不要误认为我是个因循守旧、不切实际的理论派拥护者。实际上,任何软件在快速运行之前,都必须保证该软件足够稳定和可靠。我们可以通过对实现的改善和性能工具提供的帮助,来提高软件的性能。在尚未完成类的实现时,无需过分担心性能问题。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。