2010.01.15 01:25 책 정리/C++ Template

Introduction

마지막 항목이다. 템플릿이기 때문에 명시적 인스턴스화가 존재 하는데, 이게 어떻게 해서 생겼는지, 어떻게 사용 하는지 설명 되어 있는 항목이다.

Content

명시적 인스턴스화를 하는 방법은?

명시적 인스턴스화란 인스턴스화 지점을 프로그래머의 입맛 데로 정하는 것을 말한다. 하는 방법은 template 키워드를 붙여 주면 되는데, 다음 예제를 보자.

책에 있는 예제

함수 템플릿을 명시적 인스턴스화한 예제에서 2번째 명시적 인스턴스화한 경우가 "템플릿 인자 추론"이 된다는 점을 보여 주고 있는 것이며, 4번째가 throw가 생략 될 수 있다는 것을 보여 주고 있다. 규칙을 정리하자면, 인자추론이 되게 만들거나, 강제로 인자를 넣어 주면서 앞에 template를 기입하면 된다.

이렇게 명시적 인스턴스화를 한 이유는 컴파일러가 "자동 인스턴스화"를 해주지 못했기 때문이다. 지금은 msvc나 g++이 자동 인스턴스화를 지원해 주고 있기 때문에 사용 할 일이 거의 없다. (일전에 g++ 에서 쓴 적이 있었다.)

문제점은 있는가?

예전에는 이러한 명시적 인스턴스화가 문제가 되지 않았으나, 요즘(2010년)에는 자동 인스턴스화를 대부분의 컴파일러(msvc, g++)이 지원하고 있기 때문에, 명시적 인스턴스화를 사용한 클래스 템플릿이나 함수 템플릿을 템플릿 특수화로 정의해선 안되며, 정의되었다면 명시적 인스턴스화를 사용 해선 안된다.

이 문제는 라이브러리 제작자가 라이브러리를 배포 할 때, 명시적 인스턴스화를 포함 하거나, 템플릿 특수화 정의를 포함하고 있다면, 라이브러리 사용자가 이미 제공한 명시적 인스턴스화나 템플릿 특수화를 정의 할 경우, 링크 에러가 날 수 있다. 책에선 이러한 문제 때문에 C++ 표준화 위원회에서 무엇인가 결정할 것이라는 실마리를 남겼는데, msvc2008에서 테스트 해보니, 아직도 결정 안되었다.

테스트 코드


명시적 인스턴스화를 사용 해야 할 이유가 있는가?

컴파일 속도를 개선시키기 위해서 사용 할 수 있다.
: 개인적인 사견으론 이렇게 코드를 제어 하여 노력을 쏟기 보단 쿼드코어(2010년 상반기 기준 12만원)로 컴파일 하여 시간을 버는게 더 싸다고 생각한다.

어떻게 명시적 인스턴스화를 이용 하여, 컴파일 타임을 줄일 수 있는가?

책에서 이 부분을 이해 하지 못했다. 책에서 설명한 흐름은 템플릿 인스턴스화를 명시적 인스턴스화로 억제 할 수 있고, 이러이러한 방법이 있으며 여기에 문제가 있어 저러저러한 트릭을 사용하거나, extern 키워드를 이용하면 된다고 설명 하고 있다.

현재 출판사에 어떻게 이해 해야 하는지 답변 달라고 요구한 상태이다.

Digression

명시적 인스턴스화를 쓸일 극히 적겠지만, 책 내용을 이해할 수 없어 정리가 되지 않는다.

저작자 표시
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요