C++性能向上プログラミング技術ノート:一時対象+テストコード

2904 ワード

タイプが一致しません:一般的には、Xタイプのオブジェクトが必要な場合に他のタイプのオブジェクトが提供されます.コンパイラは、提供されるタイプを何らかの方法で要求されるXタイプに変換する必要があります.このプロセスでは、一時的なオブジェクトが生成される可能性があります.
≪値による転送|Transfer By Value|emdw≫:一時オブジェクトの作成と破棄の代価は比較的高いです.可能であれば、一時的なオブジェクトの生成を回避するために、ポインタまたは参照でオブジェクトを渡す必要があります.
値による戻り:作成された関数が値によるオブジェクト(参照またはポインタに対する)を返す場合、一時的なオブジェクトが生成される可能性があります.
Openerator=()を使用して、一時オブジェクトを除去できます.
一時オブジェクトは、コンストラクション関数とコンストラクション関数の形式でパフォーマンスを半分に低下させます.
コンストラクション関数をexplicitとして宣言すると、コンパイラがバックグラウンドでタイプ変換を使用することを阻止できます.
コンパイラは、タイプの不一致の問題を解決するために一時オブジェクトを作成することが多い.このような状況は、関数の再ロードによって回避できます.
可能な場合は、オブジェクトコピーの使用を最小限に抑える必要があります.参照によってオブジェクトを渡し、返します.
「+、-、*」または「/」のいずれかの場合、=演算子を使用して一時オブジェクトを除去します.
テストコード(temporary_object.cpp)は次のとおりです.
#include "temporary_object.hpp"
#include 
#include 
#include 

namespace temporary_object_ {

// reference: 《  C++       》:   :    

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
void g(T formalArg)
{

}

std::string f()
{
	std::string s;
	// ....
	return s;
}

int test_temporary_object_1()
{
{ //     
	//    Rational  :                                。     2   3   ,         ,          。
	//    ,                 ,       3              
	Rational r1(100); // 1
	Rational r2 = Rational(100); // 2
	Rational r3 = 100; // 3
}

{ //      
	// Rational                 。          Rational  ,           。  ,                     Rational  。    (         ),                     Rational  
	//       ,            。  C++                 ,           explicit   
	Rational r;
	r = 100;
	//         Rational::operator=()       ,        
	// Rational& operator = (int a) { m=a; n=1; return *this; }
	//                  。  g()     string         
	// void g(const string& s) { ... }
	//     g()    char*  ,    g("message")      string  
}

{ //     
	//         formalArg, g()              。       t    g()     formalArg 。  ,              
	//       int       ,    t            .             g()。                  g(). 
	int t;
	g(t); 
}

{ //     
	// f()     string  ,               。    f()               p
	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; //         
}

{ //   op=()      
	std::string s1, s2, s3;
	s1 = s2 + s3; //         
	s3 = s1; // operator=(),      
	s3 += s2; // operator+=(),      }
}

{ //       s5
	std::string s1, s2, s3, s4, s5;
	// 1.         
	s5 = s1 + s2 + s3 + s4;

	// 2.   "  "    ,          
	s5 = s1;
	s5 += s2;
	s5 += s3;
	s5 += s4;
}

	return 0;
}

} // namespace temporary_object_

GitHub:https://github.com/fengbingchun/Messy_Test