2014-10-30 6 views
0

우리는 생성 된 임시 생성 수를 줄이는 방법을 보여주기 위해 RVO와 함께 작업하고 있습니다.복수 반환을 사용하는 RVO 연산자

나는 그것의 기초를 얻지 만 여러 값을 결합하여 한 줄로 돌아가는 방법을 이해하는 데 어려움을 겪고 있습니다.

const A operator + (const A &tmp) 
{ 
    return A(this->x + tmp.x); 
} 

그러나 나는 여러 값을 가진 함수에이를 적용하는 방법을 확실 해요 : 단일 임시 최적화를위한

나는

const A operator + (const A &tmp) 
{ 
    A sum; 
    sum = this->x + tmp.x; 
    return sum; 
} 

이 감소 될 수있다 매우 쉽게 이해 할 수 있었다 돌려 주다. 예를 들어 : 뒤에

Vect2D operator - (const Vect2D &tmp) const; 

Vect2D Vect2D::operator - (const Vect2D &tmp) const 
{ 
    Vect2D sum; 

    sum.x = this->x - tmp.x; 
    sum.y = this->y - tmp.y; 

    return (sum); 
}; 

내 프로세스는 다음과 같습니다

오류가 " no argument takes the value (float, float)"를 말해 함께 돌아 오기
Vect2D Vect2D::operator - (const Vect2D &tmp) const 
{ 
    return Vect2D((this->x - tmp.x), (this->y - tmp.y)); 
}; 

.

내가 초기

Vect2D 연산자를 재구성해야 할 것입니다 - CONST (CONST는 & TMP를 Vect2D);

두 개의 부동 인수를 사용할 수 있습니까? 아니면 내가 잘못 생각한거야?

, 감사합니다

E : 나는 이중 부동 소수점 연산자로 할 필요가 생각했던 긍정을위한 매트과 제리에 감사합니다.

+0

정확한 질문이 무엇인지 모르겠다. 임시 테이블이 너무 많아 수정해야하는 코드 조각을 게시 할 수 있습니까? –

+0

(N) RVO는 일반적으로 허용되는 컴파일러 최적화를 제어하는 ​​as-if 규칙의 예외입니다. 그것은 당신이 그 규칙을 사용하면서 컴파일러를 풀기 위해 노력하고있는 것 같습니다 (대부분의 고역에서). – Deduplicator

+0

'Vect2D ((this-> x-tmp.x), (this-> y-tmp.y));) 행은 두 개의 인수를 취하는 생성자를 사용하여'Vect2D'를 생성하려고 시도합니다. 오류 메시지는 생성자가 없다는 것을 나타내므로 추가해야합니다. –

답변

0

두 가지 주장을하기 위해 운영자가 Friend 기능을 요구한다는 것을 이해하지 못했습니다. 완전히 RVO는 아니지만 솔루션은 두 변수를 모두 사용하여 반환 된 temps 수를 줄입니다.

Matt와 Jerry에게 다시 한번 감사의 말을 전합니다.