본문 바로가기

책 정리/C++ Template

(37)
10장 인스턴스화 5부 : 명시적 인스턴스화 Introduction 마지막 항목이다. 템플릿이기 때문에 명시적 인스턴스화가 존재 하는데, 이게 어떻게 해서 생겼는지, 어떻게 사용 하는지 설명 되어 있는 항목이다. Content 명시적 인스턴스화를 하는 방법은? 명시적 인스턴스화란 인스턴스화 지점을 프로그래머의 입맛 데로 정하는 것을 말한다. 하는 방법은 template 키워드를 붙여 주면 되는데, 다음 예제를 보자. 책에 있는 예제 template void f( T ) throw(T) { } // 함수 템플릿을 명시적 인스턴스화한 예제 template void f(int) throw(int); template void f(float) throw(float); template void f(long) throw(long); template void f..
10장 인스턴스화 4부 : 컴파일러가 템플릿 코드를 구현한 방식 Introduction 템플릿 코드가 번역 단위마다 인스턴스화 되는 문제(이게 왜 문제이냐면, 컴파일 후 링크 단계에서 단일 정의 원칙:ODR을 위배하므로 링크되지 않는다)를 해결하기 위한 대표적인 3가지 방법을 알아 보는 장이다. Content 1. 일단 먹고 보는 인스턴스화 : Greedy Instantiation 책에는 근시안적 인스턴스화 라고 되어 있는데, .. 전체적인 그림을 보지 않고, 눈 앞에 보이면, 그냥 인스턴스화 한다는 말이다. 이렇게 진행하게 되면, 아마도 내 생각에는 컴파일러 제작자가 편할 것이다. 나중에 1개로 취합만 하면 되기 때문이다. (상대적인 편함이지, 기술이 없다는 것을 의미하지 않는다.) 이 기술에 대해서는 이야기가 나와 있지 않고, 링커가 1개의 인스턴스화만 남기고 모..
10장 인스턴스화 3부 : Template 인스턴스화 규칙 Introduction C++ 컴파일러가 템플릿을 인스턴스화 하는 규칙을 설명하고 있다. 이 규칙은 무척 많은 세부사항으로 이루어져 있다. 각 세부사항들을 알아 본다. Content 1. 템플릿은 두 단계 룩업을 한다. 템플릿 코드는 템플릿을 파싱 할 때, 1차 룩업을 하고, 인스턴스화가 될 때 2차 룩업을 하여, 이름을 찾는다. 1차 룩업을 할 땐, 일반적인 룩업(영역에서 이름 찾기)과 ADL(인자 이름으로 이름 영역 끌고 오기)를 한다. 2차 룩업을 할 땐, 종속된 이름에서 룩업을 하고, 한정되지 않은 이름을 위해서 ADL이 추가로 수행 된다. .. 이 말의 무슨 말이고 하면, 코드를 보자. // ikpil.com class NoTempalte { int notemplate_field; // 1 };..
10장 인스턴스화 2부 : 게으른 인스턴스화 Introduction 1부에선 "주문형 인스턴스화"를 통해, 언제 인스턴스화가 필요한지 알게 되었다면, 게이른 인스턴화 부분에선 좀 더 세부적으로 인스턴스화 되는 시기를 정리한다. 여기서 말하는 세부적이란, 기존에선 인스턴스화 자체에 대해서 이야기 했다면, 이 부분은 템플릿 코드의 내부 요소, 즉 클래스 템플릿의 멤버들이 언제 인스턴스화 되는지 정리 되었다는 것을 의미한다. Content 게으른 인스턴스화 코드를 보고 규칙을 파악하는게 더 빠르므로, 예제코드(책에서 발취)를 첨부하고 하나씩 정리해 보겠다. template class Safe { }; template class Danger { public: typedef char Block[N]; }; template class Tricky { publ..
10장 인스턴스화 1부 : 주문형 인스턴스화 Introduction 이번 장은 템플릿이 언제 어떻게 실체화 되는지에 대해서 정리한 것이다. 이것을 알아야 하는 이유는 "템플릿의 가시화가 되지 않았기 때문에 컴파일이 되지 않는다" 라는 직관을 길르기 위해서이다. 총 5 파트의 정리가 있는데, 이번 파트에선 "주문형 인스턴스화" 만을 정리 한다. Content 주문형 인스턴스화 우선 "인스턴스화 : instantiation" 이 어떤 단어인지 정의 해야 한다. 이 것은 실체화 라고 이해 하면 된다. C++ Template 에선 템플릿 코드가 실체화 되는 것을 인스턴스화 : instantiation 라고 한다. 여기서 말하는 주문형은, 프로그래머가 요구한 주문에 대해서 인스턴스화 되는 것을 뜻한다. - 원어가 어떻게 되어 있는지는 못찾겠다. : | 쉽게..
9장, 템플릿에서의 이름 4부 : 클래스 템플릿의 상속 Introduction 클래스 템플릿이 다른 클래스 템플릿을 상속 할 경우, 무엇을 주의 하라는지 설명 하고 있다. 클래스 템플릿을 상속 하고 잘못 사용 했을 경우, "가상 함수"가 제 역활을 못할 수 있거나, 컴파일 자체가 되지 않을 수 있으므로, 이 부분은 꼭 봐야 할 것이다. Content 시작하기에 앞서, 한가지 사실을 미리 알아두어야 한다. 바로 기반이 되는 클래스 템플릿이 파생 되는 클래스 템플릿에 기입 된 파라미터에 종속 될 경우와 종속되지 않을 경우, 이름을 찾는 규칙이 변화 한다는 사실이다. 이 두 경우 중 종속되지 않을 경우(기반 클래스 템플릿이 파생 클래스 템플릿에 기입된 템플릿 파라미터에)가 더 적은 규칙을 가지고 있으므로, 이를 먼저 정리하겠다. 1. 종속되지 않은 기반 클래스일 ..
9장, 템플릿에서의 이름 3부 : 템플릿 파싱 Introduction 이번 3부에선 템플릿 파싱 규칙에 대해서 정리하고 있다. 여기서 typename과 template 들을 사용 하는 방법과 using 사용시 주의 해야 할점, ADL로 인식 안되는 경우 등을 살펴 보고 있다. MSVC에선 일반적으로 간편하게 되는 경우가 있으나, 다른 컴파일러를 사용해야 한다면, 어느정도는 알고 있어야 된다. Content C++ 컴파일러가 C++을 파싱하는 방법 을 책에선 설명하는데, 좀 많이 생략되어서 인터넷으로 한글로 검색하다 나오지 않아 짦은 영어로 검색했다. 그리고 "dragon book"에 잘 나와 있다고 되어 있어서 검색해 보니 "http://en.wikipedia.org/wiki/index.html?curid=188976"이 있었다. 국내 번역서를 찾아..
9장, 템플릿에서의 이름 2부 : 템플릿에서 이름 룩업 규칙 아. 또 ... 날라갔다. 간소하여 정리 하자면, 1. 클래스 템플릿 내에서 프렌드 선언에서 선언을 인지하는 차이 2. 클래스 템플릿 내에서 자기 이름을 인지하는 차이 여기서 인지한다는 주체는 C++ 컴파일러이며, 인지는 다른 말로 평가한다고 표현해도 된다. 3부에선 템플릿을 파싱 하는 방법을 다룬다.