SW/C++

C++ : 템플릿 : 특수화, 장점과 단점, 베스트 프랙티스

얇은생각 2020. 4. 24. 07:30
반응형

C++ : 템플릿 : 특수화, 장점과 단점, 베스트 프랙티스

 

템플릿 특수화

특정한 템플릿 매개변수를 받로록 템플릿 코드를 커스터마이즈를 할 수 있습니다. std::vector에 좋은 예제가 있습니다. 제너릭한 벡터와 다르게 bool 형은 다르게 구현이 되어 있습니다.

제네릭 템플릿이 어느 형에나 적용되어 있습니다. 단 특정형에 특수화된 템플릿이 있다면, 그 특수화된 템플릿이 적용됩니다. 그러나 자주 사용되지는 않습니다.

하지만 std::vector에서는 bool형에 대한 특수화는 가치가 있습니다. 그 이유는 메모리를 더욱 효율적으로 활용하도록 구성할 수 있기 떄문입니다.

 

 

 

전체 템플릿 특수화

template<typename VAL, typename EXP>
VAL Power(const VAL value, EXP exponent) {}

template <>
float Power(float value, float exp)

 

템플릿 매개 변수 리스트가 비어 있습니다.  float형은 다응과 같이 지정되어서 템플릿 특수화를 구성할 수 있습니다.

 

 

부분 템플릿 특수화

template <class T, class Allocator>
class std::vector<T, Allocator> {}

template <class Allocator>
class std::vector<bool, Allocator>

 

실제 bool 형을 받로록 따로 템플릿을 특수화를 진행하는 방식은 위 처럼 구성할 수 있습니다.

 

 

 

장점과 단점

컴파일러가 컴파일 도중에 각 템플릿 인스턴스에 대한 코드를 만들어 줍니다. 컴파일 타임은 비교적 느려집니다. 따라서, 템플릿 매개 변수를 추가할 수록 더 느려진다고 볼 수 있습니다.

하지만, 런타임 속도는 더 빨라질 수 있습니다. 실행 파일 크기가 커지기 때문에 항상 그런것은 아닙니다. C#과 Java도 어느정도 해당되는 이야기 입니다. 그래서 ArrayList를 사용하지 말라는 것도 이러한 이유와 연관이 있습니다.

자료형만 다른 중복 코드를 없애는 훌륭한 방법이라고도 할 수 있습니다. 하지만, 쓸모없는 템플릿 변형을 막을 방법이 없습니다. 따라서, 최대한 제네릭 함수를 짧게 유지해야 합니다. 제네릭이 아니어도 되는 부분은 별도의 함수로 옮기는 것도 방법입니다. 이 함수가 인라인 될 수 도 있습니다.

컴파일 도중에 다형성을 부여할 수 있습니다. 가상 테이블이 없어서 프로그램이 더 빨라집니다. 하지만 exe 파일이 커지면 느려질 수도 있지만, 제일 중요한것은 코드 읽는 가독성이 너무 떨어질 수 있으며, 디버깅이 어려워질 수 있습니다.

 

 

 

템플릿 프로그래밍 베스트 프랙티스

컨테이너의 경우 매우 적합합니다. 아주 다양한 형들을 저장할 수 있습니다. 그런 이유로 Java와 C# 제네릭이 주로 컨테이너에 쓰이는 것입니다. 

컨테이너가 아닌 경우, 각기 다른 서넛 이상의 자료형을 다룬다면 템플릿을 활용해야 합니다. 두가 정도라면 그냥 클래스로 직접 구현하는 것이 좋은 방법일 수 있습니다.

반응형