读《Efficient C++》

这是一本讲C++性能优化的书,我差点以为是effective C++的山寨版~~
书中的主要观点:
1.C语言的源代码与汇编语言之间仍然保持一种线性关系。C++打破了这种线性关系,开销的波动很大。
软件低效的根源:设计效率、编码效率。设计效率包括:算法和数据结构和程序分解。编码效率包括:语言结构、系统体系架构、库、编译器优化。
2.对象的构造和析构容易造成不必要的开销,只在需要时创建对象。I/O开销是昂贵的。引用传递比按值传递高效。内联消除了频繁调用的函数所产生的函数调用开销。
3.对象的创建引发对父对象和成员对象的递归创建(或清除)。要当心复杂层次中对象的组合使用。平衡编码的灵活性和性能,按需选择是编写功能强大的类还是仅仅满足当前所需功能的类,当然前者的开销会较大。
4.虚函数会从以下几个方面造成性能损失:需要维护虚表、通过指针调用、不能内联。无法内联虚函数是虚函数最大的性能损失。比起继承,模板可提供更好的性能,因为其在编译时就确定了类型。
5.临时对象会以构造函数和构析函数的形式损失两倍的性能。通过函数重载可以避免编译器为解决类型不匹配问题而创建临时对象。
6.系统函数提供强大功能的同时也会造成性能开销。如果只在单线程环境使用简单的内存管理工作,那么编写简单的内存管理器比调用系统的库函数划算得多。
7.内联能够减少调用开销。内联更应该是编译器的优化而不是程序员进行的优化。内联的缺点是可能导致带码的膨胀,缓存出错。有些方法不能内联,例如,不能内联递归方法。
8.通过向量的reserve()的方法预设向量容器的容量能加快大量元素插入的速度。
9.考虑采用引用技术的场合:1.目标对象消耗大量的资源;2.资源的分配和释放很昂贵;3.高度共享:由于使用赋值操作符和复制构造函数,所以引用计数可能比较大;4.引用的创建和清楚相对廉价。
10.90-20规则:80%的执行情况会便利29%的代码,80%的时间消耗在执行路径所遇到的20%的函数之上。20%的可能输入将占有80%的时间。
11.最后讲了点架构优化和设计优化。大部分和《深入理解计算机系统》等书说的差不多

原文地址:https://www.cnblogs.com/opama/p/6446523.html