more effective C++
需积分: 0 167 浏览量
更新于2008-09-16
收藏 2.56MB PDF 举报
### 更有效C++:提升编程技能与设计思维的35个新方法
#### 知识点一:不将数组作为多态对象处理 (Never treat arrays polymorphically)
- **核心概念**:避免直接将数组作为类成员,尤其是当这些数组需要进行多态操作时。直接在类中声明数组可能会导致析构函数无法正确调用,进而引发内存泄漏或对象状态不一致等问题。
- **应用场景**:在需要动态分配和管理资源的情况下,应当考虑使用智能指针或者标准库容器如`std::vector`。
#### 知识点二:构造函数和非成员函数的虚化 (Virtualizing constructors and non-member functions)
- **核心概念**:虽然C++语言本身不支持虚构造函数,但在某些情况下可以通过技巧实现类似功能,例如使用工厂模式来间接创建对象。
- **应用场景**:当需要通过基类指针创建派生类对象,并希望这一过程能够被扩展时,可以考虑使用工厂模式或者其他设计模式来达到目的。
#### 知识点三:限制类实例的数量 (Limiting the number of objects of a class)
- **核心概念**:有时为了确保系统的稳定性或资源的有效利用,可能需要对某一类的对象数量进行限制。这可以通过单例模式、固定大小的对象池等方式实现。
- **应用场景**:在资源受限的环境中(如嵌入式系统),或为了提高系统性能时,可以采用此类技术。
#### 知识点四:控制堆上对象的使用 (Requiring or prohibiting heap-based objects)
- **核心概念**:通过类的设计,可以强制或禁止在堆上创建该类的对象。例如,可以通过私有化拷贝构造函数和赋值运算符来阻止对象被复制,从而只能通过new创建实例。
- **应用场景**:当对象的状态需要在整个生命周期内保持不变时,可以采用这种方式来确保对象只在堆上创建。
#### 知识点五:智能指针 (Smart pointers)
- **核心概念**:智能指针是一种自动管理内存的机制,可以有效地避免内存泄漏和悬挂指针等问题。常见的智能指针包括`std::unique_ptr`、`std::shared_ptr`等。
- **应用场景**:几乎所有的C++项目都会使用智能指针来管理动态分配的资源。
#### 知识点六:引用计数 (Reference counting)
- **核心概念**:引用计数是一种内存管理技术,用于跟踪指向一个对象的指针数量。当引用计数降为零时,对象会被自动销毁。
- **应用场景**:`std::shared_ptr`就是基于引用计数实现的智能指针。
#### 知识点七:代理类 (Proxy classes)
- **核心概念**:代理类是一种设计模式,用于控制对另一个类的访问。它可以在不修改原始类的前提下,增加额外的功能或行为。
- **应用场景**:在需要添加额外功能(如日志记录、权限检查等)但不想修改原有代码时,可以使用代理类。
#### 知识点八:双重分发 (Double dispatching)
- **核心概念**:双重分发是指在调用一个成员函数时,两次决定调用哪个函数版本的过程。第一次根据发送消息的对象类型决定,第二次根据接收消息的对象类型决定。
- **应用场景**:在需要根据两个对象的实际类型动态选择行为时使用。
#### 知识点九:区分前缀和后缀形式的增减运算符 (Distinguish between prefix and postfix forms of increment and decrement operators)
- **核心概念**:在C++中,++和--运算符有两种形式:前缀形式(如++i)和后缀形式(如i++)。它们在操作上的区别在于是否返回临时值。
- **应用场景**:理解这两种形式的区别对于正确使用这些运算符非常重要,特别是在需要考虑操作顺序或返回值的情况。
#### 知识点十:记住80-20规则 (Remember the 80-20 rule)
- **核心概念**:80-20规则指的是,在许多情况下,大约80%的效果来自于20%的原因。在软件开发中,这意味着大多数情况下可以通过优化少数关键部分来获得最大的性能提升。
- **应用场景**:在优化程序性能时,应优先关注那些对整体性能影响最大的部分。
#### 知识点十一:考虑使用惰性求值 (Consider using lazy evaluation)
- **核心概念**:惰性求值是一种延迟计算的技术,即只有在真正需要结果时才执行计算。
- **应用场景**:适用于那些计算成本高且不总是需要的结果,例如在处理大数据集或复杂算法时。
#### 知识点十二:理解临时对象的来源 (Understand the origin of temporary objects)
- **核心概念**:在C++中,临时对象是在表达式计算过程中自动创建的对象。了解何时何地会创建临时对象对于优化程序性能至关重要。
- **应用场景**:在设计复杂的表达式时,特别是涉及资源密集型对象的操作时。
#### 知识点十三:促进返回值优化 (Facilitate the return value optimization)
- **核心概念**:返回值优化(RVO)是编译器的一种优化手段,旨在避免不必要的临时对象复制。通过适当的设计和编码实践,可以促进RVO的发生。
- **应用场景**:在函数返回对象时,通过使用移动语义可以显著提高效率。
#### 知识点十四:理解虚函数、多重继承、虚基类和RTTI的成本 (Understand the costs of virtual functions, multiple inheritance, virtual base classes, and RTTI)
- **核心概念**:虽然这些特性增强了C++的灵活性和表达能力,但它们也会引入额外的运行时开销。理解这些特性的具体实现细节有助于更好地权衡利弊。
- **应用场景**:在设计类层次结构或选择继承方式时,需要考虑到这些特性带来的潜在性能影响。
以上这些知识点都是《更有效C++》这本书中提到的关键技术点,对于想要提高自己的C++编程技能和设计思维的人来说,都是非常宝贵的知识财富。通过学习这些技术和设计理念,可以更深入地理解C++语言的本质,并能够写出更加高效、可靠和可维护的代码。