다음 코드의 함수 템플릿은 클래스 템플릿의 멤버이므로 둘러싸는 클래스를 전문화하지 않으면 특수화 할 수 없습니다.이 기능 템플릿을 완벽하게 모방 한 것입니까?
그러나 컴파일러의 전체 최적화가 설정된 경우 (Visual Studio 2010 가정) 다음 코드의 if-else-statement가 최적화됩니까? 그리고 만약 그렇다면, 모든 실제적인 목적을 위해 이것은 성능 비용없이 기능 템플릿 전문화라는 것을 의미하지 않을까요?
template<typename T>
struct Holder
{
T data;
template<int Number>
void saveReciprocalOf();
};
template<typename T>
template<int Number>
void Holder<T>::saveReciprocalOf()
{
//Will this if-else-statement get completely optimized out
if(Number == 0) data = (T)0;
else data = (T)1/Number;
}
//-----------------------------------
void main()
{
Holder<float> holder;
holder.saveReciprocalOf<2>();
cout << holder.data << endl;
}
필자는 컴파일 된 변수가 컴파일 타임 상수 일 때 불필요한 조건부 블록을 최적화 할 가능성이 더 높다고 생각했습니다. 그러나 최적화가 정규 함수 인수를 사용할 때 일어날 가능성이 높다면, 거기에는 아무런 의미가 없다고 생각합니다. – zeroes00
@ Zeroes00 먼저 성능에 영향을 미칠 수 있다고 생각하면 먼저 컴파일 한 다음 어셈블리를 확인하는 것이 좋습니다. 다음은 인상적인 최적화 컴파일러의 예입니다. http://stackoverflow.com/questions/2419650/cc-macro-template-blackmagic-to-generate-unique-name/2419715#2419715 –