2014-12-09 5 views
2

성과이 형질 특성과 관련이 있습니까?형질 최적화 유형

보다 정확하게는 다음과 같은 평가 일정입니까? 그리고 컴파일러는 다음과 같은 경우 중 일부를 최적화 할 수 있습니까?

template<typename T> void Function() 
{ 
    if(std::is_pointer<T>::value == true) 
     DoSmth(); 
} 

Function<int*>(); 

는 컴파일러 최적화와 같은 코드가 그런 일 (생성 된 바이너리)를 효과적으로 될 것이다 :

는 코드를 고려

?

template<> void Function<int*>() 
{ 
     DoSmth(); 
} 
+1

예제에는 시작하는 질문이 반영되어 있지 않습니다. – rubenvb

+1

@rubenvb 어떤 방법으로 그렇게하지 않습니까? 그것은 나에게하는 것처럼 보입니다. – hvd

+0

@hvd 유형 특성에 성능 저하가 있는지 질문합니다. 이 예는 컴파일러가 상수 (즉, 컴파일 타임) 조건식을 최적화 할 수 있는지 여부를 묻습니다. 이것들은 같은 것이 아닙니다. – rubenvb

답변

4

컴파일러에는 이러한 최적화가 허용되어 있으며 은 최적화가 요청 된 경우 대부분 상수를 전파하고 불감 코드를 제거합니다.

그것은 그러나,의 라인을 따라, 두 별도의 기능을 제공하기 위해, 더 자주 그리고 더 관용적 같다 : 우리가 enable_if했다 전에도

template <typename T> 
typename std::enable_if<std::is_pointer<T>::value>::type 
Function() 
{ 
    // Pointer version... 
} 

template <typename T> 
typename std::enable_if<!std::is_pointer<T>::velue>>:type 
{ 
    // Non pointer version... 
} 

, 그것은 도우미에 과부하 해상도를 사용하는 것이 더 자주 보였다 함수, 말하자면 이 void const* (포인터 인 경우) 또는 ... ( 인 경우)과 일치하는 추가 인수를 전달합니다.

+1

함수 오버로드에 대한 제안은 다음과 같은 추가적인 이점이 있습니다 :'if (std :: is_pointer :: value == true)'블록 내부의 코드를 컴파일해야하고, 유형이 컴파일러가 아닌 경우에도 구문 상 및 의미 상 유효해야합니다. 바늘. 별도의 함수 오버로드를 사용하면 이러한 문제를 피할 수 있습니다. – hvd

+0

@hvd 고마워. 나는 분리 된 기능 관용구가 널리 확산 된 이유가 있다는 것을, 또는 적어도 의심했다. 나는 네가 그걸 때렸다고 생각해. (이제 언급 했으니 : 대부분의 경우 내가 이런 식으로 한 것 같아요. 함수 중 하나에 대한 코드가 다른 유형으로 컴파일되지 않았을 것입니다.) –

3

요즘 꽤 많이 괜찮은 컴파일러 중복 흐름 제어 검사를 제거하고 두 번째 예에서 지정한 코드를 생성합니다.