RVO 최적화

망막 정맥 폐쇄 - 반환 값 최적화
요약
반환 값 최적화 (짧은 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

이 양식에 대한 우리의 이해이다.

 

추천

출처www.cnblogs.com/vczf/p/12604695.html