2013-06-15 4 views
4

컴파일러에서 최적화되고 인라인 될 때 ​​다음 코드가 삼항 연산을 평가하는 데 필요한 분기를 제거한다고 가정하는 것이 안전한가요? 또는 대부분의 주류 컴파일러를 사용하는 경우 분기를 피하기 위해 아래의 메소드를 두 개의 분리 된 메소드로 분리하는 것이 현명합니까?C++ 템플릿 : 인라인 코드 및 컴파일러 최적화

/*! \brief this method returns the cos of an angle. User can specify if it is 
* in degrees or radians. 
*/ 
template <typename T, angle_mode AM> 
T cos(const T &angle) 
{ 
    return (AM == radians) ? 
    std::cos(angle) : 
    std::cos(degrees_to_radians(angle)); 
} 
+0

정말 어떻게 사용하는지에 따라 다릅니다. AM이 상수 일 때만 최적화가 작동합니다. AM이 변수라면 아무 것도 최적화 할 방법이 없습니다. – cup

+3

귀하의 해체가 질문과 관련이없는 것처럼 보입니다. 첫 번째 스 니펫은'degrees_to_radians()'(비교는 없지만 다른 함수를 호출 함)이고 두 번째 스 니펫은'main'입니다. 여기서 언급 한 브랜치는'glext2pi()'의 인라인 버전에 포함되어 있습니다. 'AM '에 대한 당신의 시험은 오래 전에 끝났습니다. –

답변

4

예, 항상 최적화되어야합니다.

비록 그것이 아니더라도, 나는 std::cos의 비용이 조건부 비용을 크게 가릴 것입니다.

어떤 이유로 최적화되지 않은 경우 템플릿 전문화를 사용하여 컴파일 타임에 분기를 실행하십시오.

+0

위의 정보를 바탕으로 자세히 설명해 주시겠습니까? –

+0

@MatthewHoggan 나는 어셈블리를 읽는데 꽤 나빴다. 특히 늦은 밤에. 별도의 기능과 분기가없는 버전과 비교해 봤습니까? – Pubby

+0

아니요. 나는 내 일에 전진하지 않았지만, 내일 다시 방문하기를 바랍니다. –