这部分内容讲解的是如何提高程序的效率,主要是讲解了一些思想,不涉及具体技术细节。有些条款内容不需要详细阅读,理解思想即可。·
条款16:谨记80-20法则
一个程序80%的资源用于20%的代码身上。程序员要关注20%的关键代码。
条款17:考虑使用lazy evaluation(缓式评估)
需要new的时候再new一个对象,不要提前申请内存
需要从数据库读的时候再读,不要提前读好
需要计算的时候再计算,不要提前计算好结果
个人理解:正常码代码的时候不需要考虑什么lazy evalutaion,当程序需要优化的时候再考虑。
条款18:分期摊还预期的计算成本
和条款17形成比对,这个条款的意思是eager evaluation。提前准备好资源,需要的时候立刻使用。其实就是用时间换空间,还是用空间换时间的问题。比如单例模式中的饿汉模式还是懒汉模式,就是一个经典案例。
条款19:了解临时对象的来源
1)隐式类型转换
2)函数返回对象的时候
结论:临时对象可能会很耗成本,应尽可能消除他们。更重要的是,训练发现临时对象的眼力,任何时候,看到一个reference-to-const参数,就极可能有一个临时对象被产生出来绑定到该参数。
条款20:协助完成“返回值优化(RVO)”
如果函数必须要返回一个对象的时候:
1)不要创建一个局部变量,再return这个局部变量
2)考虑用内联函数来返回值
错误的写法:
class Rationale{....};
const Rational operator*(const Rational& lhs, const Rational& rhs){
Rational result(...);
return result;//这种是典型错误案例,会有临时变量产生,增加构造析构的成本
正确的写法:
inline const Rational operator*(const Rational& lhs, const Rational& rhs){
return Rational result(...);//编译期会进行优化,规避临时变量
}
条款21:利用重载技术(overload)避免隐式类型转换(implicit type conversions)
除非重载大量函数有好处,比如提高程序的效率,否则没必要增加一大堆重载函数。
条款22:考虑以操作符复合形式(op=)取代其独身形式(op)
int a,b,c,d;
int result = a+b+c+d;//效率低,因为有临时变量的产生,如果abcd是复杂的数据类型会消耗时间
int result;
result +=a; result +=b; result +=c; result +=d;//效率高,没有临时变量
上面2中写法的细微效率差异,写一些数学线性代数算法程序的人会考虑吧。
条款23:考虑使用其他程序库
没啥可写的
条款24:了解virtual functions、multiple inheritance、virtual base classes、runtime type identification
写的挺好,并给了一个参考文献Inside the C++ Object Model(by Standley B. Lippman, AQ 1996)第3、4、7章,或《多态与虚拟》(侯捷、松岗,1998)第2版。