템플릿 정의하기에서 정의하는 방법을 정리했다. 정리 되는 도중에 한가지 의문점이 생기는데, 그 의문점은 "도데체 언제 템플릿들이 코드화가 이루어 지는 것일까?" 이다. 당연한 이야기 겠지만, 컴파일러에 의해서 링크가 되기 전에 이루어 질 것이지만, 정확한 시점을 모르면 약간 어리 둥절할 때가 있기 떄문이다.

이 어리둥절함은 컴파일 타임이라는게 전처리기 타임이라는 것도 있고 이진코드 생성 타임도 있고, 문법 검사 타임도 있고, .. 여러 타임이 나누어져 있기 때문에, 템플릿 인스턴스화의 시점에 따라서 템플릿 코드가 달라 질 수 있어, 어리 둥절 하게 된다.


그렇다면,  "템플릿 인스턴스화" 란 무엇인가?

템플릿 매개변수에 인자를 넘겨서 클래스 선언을 만드는 과정을 "템플릿 인스턴스화" 라고 한다. 이런 인스턴스화는 모두 컴파일러 몫이다. 이 컴파일러 몫은 대단히 많이 있어서, 클래스의 경우 복사 생성자, 복사 할당자, 기본 생성자와 소멸자 등을 만들어 주듯이 템플릿 클래스의 경우에도 해당 템플릿 매개변수별 다 만들어 준다.


언제 "템플릿 인스턴스화"가 일어 날까?

템플릿 인스턴스화 시점은, 그 클래스 템플릿이던 함수 템플릿이던 그 템플릿 들이 사용 될 때 이다. 이 때 문법 검사도 하게 된다. 이것으로 전처리기 다음에 일어나 코드가 인스턴스화가 되고, 문법 검사를 하는 것을 알수 있다.

그래서 템플릿을 사용하지 않았을 때는 인스턴스화가 되지 않았기에 문법 검사를 하지 않는 다는 것을 알 수 있다. 이것으로 디버깅을 편하게 하기 위해선 우선 일반 클래스를 만들고 테스트 해보고 템플릿 화를 시키는게 좋다고 한다.


그럼, "특수화 버전 템플릿"은 언제 인스턴스화가 될까?

역시 그 템플릿이 사용 될 때 인스턴스화가 되나, 클래스의 멤버 함수가 템플릿이고, 그 템플릿의 특수화가 있다면, 상속 과정에서 모두 인스턴스화가 된다. 막는 방법은 일반 클래스를 템플릿 클래스로 사용 함으로써 모두 인스턴스화가 되는 것을 막을 수 있다.


무엇이 인스턴스화 될까?

언제 인스턴스화와 마찬가지로 클래스 자체는 인스턴스화 되지만, 각 멤버 함수들은 템플리 함수가 아니여도, 사용 해야지만 인스턴스화가 된다.


모든 컴파일러가 동일 한가?

시점이나 사용형태는 동일 하나, 컴파일러마다 그 템플릿을 읽어 들이는 파서가 다르기 때문에, 템플릿 구문이 다른 컴파일러에선 사용 되지 못할 수 있다는 점이 있다. 물론 표준은 있지만 이 표준을 지키지 않을 수 있고(대부분 지킨다), 해당 컴파일러의 파서가 템플릿 해석기의 버전이 낮아서 역시 못 읽을 수도 있다.


문제점은 없는가?

기본적으로 컴파일러가 인스턴스화를 결정하여, 최적화시켜서 코드를 인스턴스화 하지만, 기본적으로 클래스 자체를 인스턴스화 해야 하기 때문에, 각 매개변술로 한개씩 코드를 만들어 버린다. 이것은 실행 파일의 크기를 크게 하여, 메모리 캐쉬가 힘들어지고, 캐쉬 적중률이 낮아져 전체적인 속도를 느리게 만들어 버릴수 있다.

... 하지만 경험상 문제되어 본적이 없었기에, 알고 있다가, 너무 심하다 싶으면 직접 테스트 해봐야 할 것이다.


총평

템플릿 인스턴스화가 지금까지 제일 재미있던 부분인거 같다. 조금 더 컴파일러에 대해서 알았다는 느낌이 든다.(물론 .. 무시무시한 컴파일러를 알기에는 부족하지만...)

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기