2017-01-01 4 views
1

const 참조 복용량 릴레이에 의해 반환 뭔가를 저장하는 경우 방황하는이 상황을 가지고,이 함수는 수백 번 호출 할 수 있습니다.리시버 함수가 값을 복사 할 가치가있는 C++에서 const 참조로 반환 하시겠습니까?

는 내가 가지고에서

int x = 0; 
class Foo { 
... 
.... 
Mo mo; 
void Foo::setInt(float scaleX) 
{ 

    x = mo.doSomthing().toInt(); 
    //x is class member which other functions are using it 

} 
... 
... 
.. 
} 

하여 D : oSomthing().toInt()를 호출

Val Mo::doSomthing() 
{ 
    Val v(444444); 
    return v; 
} 

: const를 기준으로 수를 얻는 것을

struct Val 
{ 
public: 
    Val(int& v) 
    { 
     iVal = v; 
    } 

    const int& toInt() 
    { 
     return iVal; 
    } 

private: 
    int iVal; 
}; 

기능을 int를 돌려
일반 컨테이너 이 사건은 일부 비트를 저장하기 위해 const 참조를 사용하기위한?

+4

참조로 기본 형식을 반환하는 것은 불필요한 오버 헤드입니다. 실제로 두 개의 복사본은 단일 복사본과 const 참조보다 저렴할 수 있습니다. 그러나 확실한 방법은 단단한 루프를 프로파일하는 것입니다. – StoryTeller

+5

조숙 한 최적화에 읽기. 일반적으로 ** 측정 **. –

+1

첫 번째 질문 : 프로그램 실행의 전형적인 시간에이 루프가 수십억 번 실행됩니까? 대답이 "둘 이상"이 아니라면 여기서 시간 낭비입니다. 이런 종류의 작업은 현대 프로세서에서 어리 석다. 벤치마킹 중이라면 의미있는 데이터를 얻기 위해 수백만 사이클 이상을 실행해야한다면 놀라지 않을 것입니다. – tadman

답변

1

일반적으로 스칼라 유형의 경우 값으로 반환하는 것이 더 저렴합니다. 참조 (및 포인터)는 일반적인 스칼라 유형과 거의 동일한 크기 (단어 길이)를가집니다. int &을 반환하면 동일한 양의 데이터가 반환되지만 참조 된 데이터에 액세스 할 때 실행중인 플랫폼은 참조를 해결해야합니다 (참조 된 메모리 액세스).

이전 의견은 맞습니다. 먼저 측정하십시오. 이것은 일종의 미세 최적화입니다.

+1

"POD 유형"대신 "내장 유형"이라고 말해야합니다. – HolyBlackCat

+0

당신은 절대적으로 옳습니다. POD는 내장형과 아주 작은 구조체이지만 POD 유형의 정의는 더 넓습니다. 내 대답을 바로 잡았어. – Broothy