2009-10-21 3 views
2

는 다음 사항을 고려하십시오 :"간단한"유형의 값을 참조로 전달하는 것이 가치가 있습니까?

int increment1 (const int & x) 
{ return x+1; } 

int increment2 (const int x) 
{ return x+1; } 

내가 같은 객체 클래스에 대한 참조를 통과 이해하지만 간단 유형에 대한 참조를 전달하는 가치가 있는지 궁금 해요? 어느 것이 더 최적입니까? 참조로 전달하거나 값으로 전달 (simle 유형의 경우)

+1

질문에 다른 부분을 추가 할 수 있습니까? 'increment2'에서'const'의 핵심은 무엇입니까? 호출자가 호출 한 사람이 값으로 전달되는 인수로 처리하는 이유는 무엇입니까? –

+1

이 경우 const의 포인트는 함수 인수를 변경 불가능하게 유지하는 것입니다. 이는 함수 작성자가 더 중요하게 생각합니다. 함수의 어디서나 원래 인수를 계속 처리합니다. – nasmorn

+1

'const'는 호출자에게도 큰 영향을 미칩니다 :'f (1)'과 같은 정수형 리터럴 인자로'void f (int & x)'를 호출 할 수는 없지만'void f (const int & x)'를 호출합니다. –

답변

6

"참조로 호출"의미론이 필요하지 않으면 (즉, 호출 수신자의 실제 변수에 액세스하려는 경우가 아니라면 호출을 사용해서는 안됩니다. 간단한 유형에 대한 참조. "const T &arg" vs. "T arg"

6

당신은 또한 premature optimization을 이해 마십시오 유사한,보다 일반적인 토론을 참조하십시오

은? :)

가장 명확한 부분을 수행하십시오. 함수가 값을 반환 할 경우 참조가 필요하지 않습니다. 코드의 (인간!) 독자는 이유가 없기 때문에 왜 참조가 사용되는지 궁금해 할 것입니다.

업데이트 :이 기능을 increment()이라고하려면 해당 값이 전달 된 값을 변경하고 반환하지 않아야 함을 의미합니다. 장소에 따라 작동 방식이 달라지는 것 같습니다. 당신이 빠른 무엇인지 조사하고 있다면 나는 아직도 당신이 조기에 최적화 있다고 생각,

void increment(int &value) 
{ 
    ++value; 
} 

: 그럼 참조 (또는 포인터)를 사용하는 의미를 확인하고 반환 값을 제거 할 수 있습니다.

+0

좋은 링크. 나는 동의한다. – bobby

+0

Scott Meyers와 Herb Sutter는 의견이 다를 것입니다. 값에 의한 통과와 ref-to-const 사이의 결정은 조기 최적화의 문제가 아닙니다. – sellibitze

0

아마도 "가치가있는"것은 아니지만 때로는 다릅니다. 다음 함수를 고려하십시오.

int const* addr_ref (int const& i) { return &i; } 
int const* addr_byvalue(int const i) { return &i; } 

분명히 다른 값을 반환합니다. 때로는 유용합니다.

그 사이에 코딩 규칙을 고수해야합니다. 함수 내에서 가장 가능성이있는 컴파일러의 최적화는 불필요한 참조를 제거하고 호출자 코드에서도 참조를 사용하므로 성능은 거의 문제가되지 않습니다.

0

기능이 템플리트 화 된 경우 선택하는 것이 더 힘들어집니다. T를 복사하는 데 비용이 많이 들거나 비용이 많이 들지 않는 경우 T를 값 또는 const 참조로 받아 들여야합니까?

이 경우에는 const 참조를 전달하는 것이 좋습니다. T의 크기가 참조의 크기보다 작거나 같은 경우 컴파일러에서 최적화를 수행 할 수 있습니다. const 참조 매개 변수는 매개 변수를 수정하지 않기 때문에 매개 변수를 값으로 전달하기 만하므로 부작용은 동일합니다. 그러나 컴파일러는이 최적화를 수행하지 않기로 선택할 수도 있습니다. 특히 const_cast가 관련되어 있으면 문제가 해결되지 않는 경우가 있습니다.

그러나 그 이유 때문에 const 참조를 전달하는 편이 좋을 것입니다. 유형 및 아키텍처의 크기에 따라 영리한 컴파일러가 올바른 전달 방법을 선택할 수 있다고 확신 할 수는 있지만 가능하지는 않습니다.

+0

필자는 컴파일러가 "int const"를 "int const"로 바꿀 수 없다고 생각합니다. 최소한 이것이 관찰 가능한 차이를 만들 수있는 멀티 스레딩 날짜와 시간에는 없습니다. 데이터 공유 및 인종. – sellibitze

+0

필자는 같은 이유로 일반적인 서브 표현식 등을 합리적으로 캐시 할 수 있다고 생각합니다. 컴파일러에 해당 지점을 가져 와서이를 방지하기 위해 명시 적으로 휘발성 const 참조로 표시해야합니다. – AshleysBrain

+0

다른 점이 있습니다. as-if 규칙에 따르면, 컴파일러는 그러한 변환이 아무런 주목할만한 차이를 만들지 못할 것이라는 것을 증명할 수 있다면 그렇게 할 수 있습니다. 그러나 멀티 스레드의 경우에 발생할 수 있습니다. 이 함수는 나중에 참조 된 int에 적절한 동기화로 액세스하고 다른 스레드에서 변경할 수 있습니다. – sellibitze

관련 문제