2010-01-21 3 views

답변

15

가치가있는 (Point, complex) 값싼 복사 기본 유형 (int, char, float, ...) 및 POD 구조체를 선호하십시오.

이것은 참조로 전달할 때 필요한 간접 참조보다 효율적입니다.

Boost's Call Traits을 참조하십시오.

템플릿 클래스는 call_traits<T> 또는 기능에서 어떤 타입 T의 파라미터를 전달하는 "최적"방법을 캡슐화하고, 아래 표와 같이 정의 형식 정의의 집합으로 이루어져있다. call_traits의 목적은 "참조에 대한 참조"와 같은 문제가 발생하지 않도록하고 매개 변수가 가능한 가장 효율적으로 전달되도록하는 것입니다.

4

예, 전달 된 참조 인수에 액세스하려면 전달 된 값 인수보다 더 많은 간접 참조가 필요할 수 있습니다. 게다가 인수의 크기가 단일 포인터의 크기보다 작 으면 속도가 느려질 수 있습니다. 물론 컴파일러가 최적화하지 않는다고 가정합니다.

+0

그렇다면 그의 컴파일러가이를 최적화하는지 어떻게 알 수 있습니까? – Arthur

+2

이진 코드 –

7

copy elision 및 RVO (Return by Value Optimization)에 대한 내용은 "Want speed ? Pass by value"입니다. 그것은 종종 컴파일러가 참조를 사용하여 컴파일을 수행하지 못하게한다고 설명합니다.

1

컴파일러는 형식이 참조/포인터의 크기와 같거나 작은 경우 단순히 값을 전달하여 참조로 원시 형식을 전달할 수 있습니다. 컴파일러가 이것을 보증 할 수는 없으므로 선택이 있다면 값으로 원시 타입을 전달하십시오. 템플릿이 짜여진 코드에서는 어쨌든 참조로 전달해야합니다. 벡터의 push_back은 const 참조를 사용합니다. int의 벡터를 가지고 있다면, 원시 타입에 대한 참조를 전달할 것입니다. 이 상황에서 컴파일러가 참조를 값으로 대체하여 최적화 할 수 있기를 바랍니다. 벡터가 큰 타입을 저장할 수 있기 때문에, const 레퍼런스를 받아들이는 것이 최선의 선택이다.

+0

을 보면 "호출자가 참조를 수정하지 않거나 수정할 수있는 코드를 호출 한 후에 읽을 수있는 한 컴파일러에서 최적화 할 수 있습니다." 물론 그럴 경우에는 "어느 쪽이 옳은가"라는 질문에 "어느 쪽이 옳은가"라는 질문을하지 않으려 고한다. :-) 어색한 것은 컴파일러가 최적화 할 수 있다고 생각하는 경우이지만 실제로는 당신이 어떤 이유를 간과했기 때문에 그것은 참조가되어야합니다 (에일리어싱 규칙은 놀라움의 주요한 원인입니다). –

관련 문제