青岛金狮广场影讯:《提高C++性能的编程技术》简单札记
《提高C++性能的编程技术》简单札记
1. 对象定义会以对象的构造函数和析构函数的形式引起隐性的执行。
2. 构造函数中的列表初始化和条件构造是减少构造函数和析构函数调用开销的一般做法。
3. 不少情况下,char指针可完成string对象的工作,且更加高效。
4. 继承和合成通常会带来代码重用和性能之间的基本冲突。
5. 全部计算开销是一次计算中所执行指令的总和,需求开销是为得到计算结果所必需的指令构成的子集,计算损失是通过可选的设计和实现能够消除的那部分计算。
6. 对象的创建或清除引发对父对象和成员对象的递归创建或消除,要担心复杂层次中对象的组合性使用带来的创建和清除开销。
7. 要确保所编写的代码实际使用了所有创建的对象和这些对象所执行的计算。
8. 对象的创建和消除会带来开销,除非真要使用,否则不要创建,且要把对象的创建推迟到要使用他的块中。
9. 编译器在执行构造行数部分之前必须初始化被包含的成员对象(初始化列表方式),这将减少在构造函数里面的调用赋值操作带来的开销和临时对象的产生。
10. 虚函数的代价源于无法内联函数调用,其函数调用是在运行时绑定的。
11. 相比继承,模板可提供更好的性能,它们把类型的确定提前到编译时。
12. 如果必须按值返回一个对象,那么返回值优化将通过消除局部对象的创建和清除来提高性能。
13. 临时对象会议构造函数和析构函数的形式损失两倍的性能
14. 把构造行数声明为explicit可阻止编译器使用类型转换。
15. 编译器经常为了解决类型不匹配问题而创建临时对象,可通过函数重载避免这种情况。
16. 应尽量避免对象的复制,按引用来传递和返回对象。
17. 在
18. 全局内存管理器new delete是通用的,开销也是昂贵的。
19. 如果主要需要分配固定大小的内存块,那么专用的固定大小内存管理器将带来显著的性能提升。
20. 如果开发了一套有效的单线程分配器,那么通过使用模板可以轻松扩展到多线程环境中。
21. 内联就是用方法代码替代方法调用。
22. 内联通过消除调用开销而提高性能,并允许进行调用间优化。
23. 过度内联可能会增大代码尺寸,带来更多的缓存失败和页面错误。
24. 微小(通常少于4条源代码级语句的方法)和唯一(程序中只有一个调用点)的方法总是可以内联的。
25. STL是抽象、灵活和效率的非同寻常的综合。
26. 对于某种特定的使用方式,一些容器可能比另外一些更为高效,区分应用场景很重要。
27. 引用计数使用场景:目标对象消耗大量资源,资源的分配和释放很昂贵,高度共享,引用的创建和消除相对廉价。
28. 预先计算,缓式计算,无用计算合理使用和避免。
29. Amdahl法则给出了应用程序的潜在可伸缩性的上限,被串行化的计算部分造成了对可伸缩行的限制。
30. 任务分解,代码移出,利用缓存,无共享,部分共享,锁粒度,伪共享,Thundering Herd现象,读写锁同样注意合理使用和避免。
其中讲引用计算和内存管理部分列举的例子,值得好好品味。