从两个方面阐述-率的问题:第一是从语言独立的角度-高性能的算法和数据结构,第二是c++语言本身
知识点16:牢记80-20准则
80-20准则说的是大约20%的代码使用了80%的程序资源:
大约20%的代码耗用了大约80%的运行时间;
大约20%的代码使用了80%的内存;
大约20%的代码执行80%的磁盘访问;
大约80%的维护投入在20%的代码上。
使用profiler程序识别出令人讨厌的程序的20%部分。
知识点17:考虑使用lazy evaluation(懒惰计算法)
引用计数:
除非确实需要不要为任何东西制作拷贝,避免不需要的对象拷贝。
区别对待读取和写入:通过使用operator[]区分出读操作。
Lazy Fetching(懒惰提取):mutable(任何函数中都能被改变包括const函数),避免不需要的数据库读取操作。
Lazy Expression Evaluation(懒惰表达式计算):避免不需要的数字操作。
知识点18:分期摊还期望的计算
当必须支持某些操作而不总是需要其结果时,lazy evaluation是在这样时候使用的用以提高程序效率的技术。
当必须支持某些操作而其结果几乎总是被需要或者不止一次地需要时,over-eager是在这种时候使用的用以提高程序效率的一种技术。
知识点19:理解临时对象的来源
1.在c++中真正的临时对象时看不见的,它们不出现源码中,建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在两种条件下产生:为了使函数成功调用而进行隐式类型转换和返回对象时。
2.当通过传值(by value)方式传递对象或者传递常量引用(reference-to-const)参数时才会发生这些类型转换,当传递一个非常量引用(reference-to-non-const)参数对象,就不会发生。
知识点20:协助完成返回值优化
消除局部变量->消除临时变量->消除函数调用
知识点21:通过重载避免隐式类型转换
知识点22:考虑使用运算符的赋值形式(op=)取代其单独形式(op)
operator的赋值形式(operator+=)比单独形式(operator+)效率更高。
知识点23:考虑变更程序库
比如:iostream与stdio
知识点24:理解虚拟函数、多继承、虚基类和RTTI所需的代价
1.当调用一个虚拟函数时,被执行的代码必须与调用函数的对象的动态类型相一致,指向对象的指针或者引用的类型是不重要的,大部分编译器是使用virtual table(vtbl)和virtual table pointers来实现。
2.虚函数所需代价:
第一:必须为每个包含虚函数的类的viertual table 留出空间。
第二:每个包含虚函数的累的对象里,你必须为额外的指针付出代价。
3.RTTI能让我们在运行时找到对象和类的有关信息,这些信息被存储在类型为type_info的对象里,可以通过typeid操作符访问一个类的type_info对象。