笔记列表
《提高C++性能的编程技术》笔记:总结
《提高C++性能的编程技术》笔记:跟踪
《提高C++性能的编程技术》笔记:构造函数、析构函数
《提高C++性能的编程技术》笔记:临时对象
《提高C++性能的编程技术》笔记:内存池(单线程、多线程)
《提高C++性能的编程技术》笔记:内联
《提高C++性能的编程技术》笔记:STL
《提高C++性能的编程技术》笔记:引用计数
《提高C++性能的编程技术》笔记:编码优化
《提高C++性能的编程技术》笔记:设计优化/可扩展性/系统体系结构
类型不匹配:一般情况是指当需要X类型的对象时提供的却是其它类型的对象。编译器需要以某种方式将提供的类型转换成要求的X类型。这一过程可能会产生临时对象。
按值传递:创建和销毁临时对象的代价是比较高的。倘若可以,我们应该按指针或者引用来传递对象以避免生成临时对象。
按值返回:如果编写的函数是按值返回对象(与引用或者指针相对),就很可能生成临时对象。
可以使用operator=()消除临时对象。
临时对象会以构造函数和析构函数的形式降低一半的性能。
将构造函数声明为explicit,可以阻止编译器在幕后使用类型转换。
编译器常常创建临时对象来解决类型不匹配问题。通过函数重载可以避免这种情况。
如果可能,应尽量避免使用对象拷贝。按引用传递和返回对象。
在可能是”+、-、*”或者”/”的地方,使用=运算符可以消除临时对象。
以下是测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <iostream> #include <chrono> #include <string> namespace temporary_object_ {
class Rational { friend Rational operator + (const Rational&, const Rational&); public: Rational(int a = 0, int b = 1) : m(a), n(b) {} private: int m; int n; }; template<class T> void g(T formalArg) { } std::string f() { std::string s; return s; } }
using namespace temporary_object_;
int main() { { Rational r1(100); Rational r2 = Rational(100); Rational r3 = 100; } { Rational r; r = 100; } { int t; g(t); } { std::string p; p = f(); std::string s1 = "Hello"; std::string s2 = "Wold"; std::string s3_1 = s1 + s2; std::string s3_2; s3_2 = s1 + s2; } { std::string s1, s2, s3; s1 = s2 + s3; s3 = s1; s3 += s2; } { std::string s1, s2, s3, s4, s5; s5 = s1 + s2 + s3 + s4; s5 = s1; s5 += s2; s5 += s3; s5 += s4; } return 0; }
|
利用 godbolt 执行,相应代码见 点击这里