망막 정맥 폐쇄 - 반환 값 최적화
요약
반환 값 최적화 (짧은 RVO의 반환 값 최적화) 컴파일러 최적화 메커니즘이다 :
기능들이 사용자를 임시 객체 반환을 만드는 경우, 다음 임시 객체 소비하는 생성자 (생성자)와 생성자 호출 (복사 생성자)와 소멸자를 호출 할 때 객체를 반환해야합니다 (소멸자 복사 ) 호출의 비용. 약간의 최적화를 만드는 경우, 비용은 따라서 통화 복사 생성자와 소멸자 순서를 호출 할 필요가 없습니다 생성자 함수의 비용을 줄일 수있다.
예에서 살펴 보자
사용법 #include <iostream> 사용 스페이스 성병; 클래스 하여 Rational { 공개 : 하여 Rational ( INT 분자 = 0 , INT 분모 = 1 {N (분자), D (분모)) COUT << " 생성자 호출 ... " << ENDL; } ~ 하여 Rational () { COUT << " 소멸자 호출 ... N : " << N << " D : " << D << ENDL; 합리적인 및 {) 우 이 -> D = rhs.d; 이 -> N = rhs.n; cout과는 << " 복사 생성자 호출 ... " << endl의; } INT의 분자 () CONST { 창 N; } INT의 분모 () CONST { 복귀 D; } 개인 : INT N, D; }; CONST 하여 Rational 연산자 (* CONST 하여 Rational 및 좌, CONST 하여 Rational 및 우) { COUT<< " ----------- * 연산자를 입력 ----------- " << ENDL 단계; 합리적인 TMP (lhs.numerator () * rhs.numerator () lhs.denominator () * rhs.denominator ()); COUT << " ----------- 남기기 연산자 * ----------- " << ENDL; 반환 TMP; } INT 본체 ( 의 INT 는 argc, 문자 ** ARGV) { 하여 Rational X ( 1 , 5 ), Y ( 2 , 9 ); 합리적인 Z= X * Y; COUT << " 결과 CALC : " << z.numerator () << " / " << z.denominator () << ENDL; 반환 0 ; }
사용 gcc4.8.4 실행 :
... 호출 생성자 생성자 호출 ... ----------- 입력 연산자를 * ----------- 생성자 호출 ... ---------- - 남기기 연산자 * ----------- CALC 결과 : 2 / 45 소멸자 호출 ... N : 2D : 45 소멸자 호출 ... N : 2D : 9 소멸자 호출 ... N : 1D : 5
알고 보니 이유를 gcc4.8.4의 RVO 최적화가 기본적으로 활성화되어 TMP 객체와 생성하지 않고 파괴, 가까이에서의 모습, 사용할 수 있도록 -fno-생략하다 - 생성자
> g ++ -fno-elide- 생성자의 main.c > ./a. 에서 생성자 호출 ... 생성자 호출 ... ----------- 입력 연산자 * ----------- 생성자 호출 ... --------- - 남기기 연산자 * ----------- 복사 생성자가 ...라는 소멸자가 호출 ... N : 2D (45) 복사 생성자가 호출 ... 소멸자가 호출 ... N : 2D : 45 CALC 결과 : 2 / 45 소멸자 호출 ... N : 2D : 45 소멸자 호출 ... N : 2D : 9 소멸자 호출 ... N : 1D : 5
이 양식에 대한 우리의 이해이다.