【读书笔记】《More Effective C++》 - 效率
《More-Effective-C++》读书笔记
效率
条款16 谨记80-20法则
这一条款说明影响程序运行效率的代码一般只占总代码的20%,使用程序分析器分析出造成性能瓶颈的对应代码。
条款17 考虑使用lazy evaluation(缓式评估)
缓式评估的思想是延缓运算,知道必须要的时候。对于你的软件被要求执行某些计算,而那么计算其实可以避免的场景,缓式评估有一定效率提升。书中举例说明了缓式评估可以提高效率的四个场景:
Reference Counting(引用计数)
: 避免非必要的对象复制。区分读与写
: 写操作比读操作更耗时,用缓式评估和proxy classes来区分operator[]的读与写操作。Lazy Fetching(缓式取出)
: 针对读取数据库数据并实例化大对象。这样一个大数据对象往往比较耗时,则一开始只产生该对象的“外壳”,不从数据库中读取数据,直到某个字段被真正需要。Lazy Expression Evaluation(表达式缓评估)
: 避免非必要的数值计算。
条款18 分期摊还预期的计算成本
与条款17不同,这一条为超急评估(over-eager evaluation),在被要求之前就先把事情做下去。针对的场景是如果你的程序常常会用到某个计算,可以设计一份数据结构以便能够极有效率的处理需求,常见的做法有caching(数值缓存)和Prefetching(预先取出)。
条款19 了解临时对象的来源
这里说的临时对象是指没有命名的non-head object
,此类的对象比较隐蔽,其对应的构造和析构函数也会对你的程序性能造成影响。书中给出了生成临时对象的常见两种场景:
- 函数调用时的隐形类型转换
- 函数返回值为一个对象(by value),如operator+。
条款20 协助完成"返回值优化(RVO)"
应尽可能避免返回对象,必须要返回时以返回constructor arguements取代对象。 eg.
const Rational operator*(const Rational& lhs,
const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
条款21 利用重载技术(overload)便面隐式类型转换(implict type coversions)
隐式类型转换应能避免就避免,多重载几个函数以支持多种合法type,减少隐式类型转换发生次数。
条款22 考虑以操作符复合形式(op=)取代其独身形式(op)
以op=为基础实现op。
条款23 考虑使用其他程序库
根据场景以及性能瓶颈选择合适的library。
条款24 了解virtual functions, multiple inheritance, virtual base classes, runtime type identification的成本
性质 | 对象大小增加 | Class数据量增加 | Inlining几率增加 |
---|---|---|---|
虚函数 | 是 | 是 | 是 |
多重继承 | 是 | 是 | 否 |
虚拟基类 | 往往如此 | 有时候 | 否 |
运行时期类型辨识 | 否 | 是 | 否 |
转载自:https://juejin.cn/post/6994084424606285854