笔记列表
《提高C++性能的编程技术》笔记:总结
《提高C++性能的编程技术》笔记:跟踪
《提高C++性能的编程技术》笔记:构造函数、析构函数
《提高C++性能的编程技术》笔记:临时对象
《提高C++性能的编程技术》笔记:内存池(单线程、多线程)
《提高C++性能的编程技术》笔记:内联
《提高C++性能的编程技术》笔记:STL
《提高C++性能的编程技术》笔记:引用计数
《提高C++性能的编程技术》笔记:编码优化
《提高C++性能的编程技术》笔记:设计优化/可扩展性/系统体系结构
类型不匹配:一般情况是指当需要X类型的对象时提供的却是其它类型的对象。编译器需要以某种方式将提供的类型转换成要求的X类型。这一过程可能会产生临时对象。
按值传递:创建和销毁临时对象的代价是比较高的。倘若可以,我们应该按指针或者引用来传递对象以避免生成临时对象。
按值返回:如果编写的函数是按值返回对象(与引用或者指针相对),就很可能生成临时对象。
可以使用operator=()消除临时对象。
临时对象会以构造函数和析构函数的形式降低一半的性能。
将构造函数声明为explicit,可以阻止编译器在幕后使用类型转换。
编译器常常创建临时对象来解决类型不匹配问题。通过函数重载可以避免这种情况。
如果可能,应尽量避免使用对象拷贝。按引用传递和返回对象。
在可能是”+、-、*”或者”/”的地方,使用=运算符可以消除临时对象。
以下是测试代码:
| 12
 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 执行,相应代码见 点击这里