내가 C++에 조예가 깊어서 글을 남기는 것이
아니라, Effecitve C++ 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면
지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필
이번 항목의 주제는 "템플릿의 최대의 적 코드 비대화를 막는 원리" 에 대해서 이다. 이게 무슨 말인지 모르겠다면, 아래 예저 코드를 통하여, 실제로 컴파일 용량을 확인해 보도록 하자.
예제 1 : 코드 비대화를 보여주는 템플릿 아용 사례, MSVC2005 Debug Mode : 88KB
아참, 템플릿 비타입 매개변수(Template non-type parameter)는 적법한 문법이다.
예제1 의 Darw() 함수를 보면, double 형, size_t 형 매개변수를 받아, double 형의 n만큼 크기를 출력해 준다. 여기서 double형으로써 계산되는 size_t 만 변경 되니까, double타입 템플릿만 만들면 되지 않을까? 그리고 size_t 는 매개변수로써 받으면 더 좋을 텐데... 라고 생각했다면, 당신은 개발자의 자세가 이미 갖추어진 분이십니다.(라고 책에서 말해 준다...)
예제 2 : 코드 비대화를 줄인 템플릿 이용 사례, MSVC2005 Debug Mode : 40KB
이제 왜 이것이 템플릿을 사용함에 있어, 최대의 적인지를 실감하게 될 것이다. 원리로는 몇개 있지만, 예제코드 2에서 처럼, "1. 불필요한 템플릿 매개변수 선언으로 코드를 비대화 시키지 말자." 가 그 중 하나 이다. 이 원리는 어떻게 보면 항목 44의 제목과 일맥 상통하게 된다.
이것이 함수 템플릿이 아닌 클래스로 넘어가게 되면, 조금 복잡해 지는 경향이 있어, 함수로써 설명을 한것이다. 또한 비타입 매개변수(non-type parameter)에만 국한되게 이야기 했지만, 원리를 설명하기 위해서 가장 적절하기 때문이다.
클래스에게는 어떻게 적용 시킬까?(책의 경우 비타입 매개변수(non-type parameter)의 경우만 나와있다. 아마도 너무 방대한 부분이기에, 항목 44에선 원리만 알려 주는게 더 좋겠다고 생각 한듯 싶다.)
그 원리는 템플릿에 영향 받지 않는 함수 부분은 전역 함수로 빼고, 이것을 클래스 내부에서 호출 하여 처리 한다. 마찬가지로 템플릿에 영향을 받는 함수는 세세하게 분활하여, 함수 호출 식으로 처리해도 되나, 이럴 경우 오히려 더 복잡해 지기 때문에, ... 어느정도는 유들있게 하는게 더 좋을 때도 많다.
이것만은 잊지 말자!
1. 템플릿 매개변수에 종속되지 않는 코드를 파악하자.
2. 1번의 경우로 파악한것들을 함수 매개변수로 바꾸어 해결 할수 있다면, 일반 함수로 뺴고 템플릿 함수에서 일반 함수 호출로 해결을 한다.
이번 항목의 주제는 "템플릿의 최대의 적 코드 비대화를 막는 원리" 에 대해서 이다. 이게 무슨 말인지 모르겠다면, 아래 예저 코드를 통하여, 실제로 컴파일 용량을 확인해 보도록 하자.
예제 1 : 코드 비대화를 보여주는 템플릿 아용 사례, MSVC2005 Debug Mode : 88KB
아참, 템플릿 비타입 매개변수(Template non-type parameter)는 적법한 문법이다.
예제1 의 Darw() 함수를 보면, double 형, size_t 형 매개변수를 받아, double 형의 n만큼 크기를 출력해 준다. 여기서 double형으로써 계산되는 size_t 만 변경 되니까, double타입 템플릿만 만들면 되지 않을까? 그리고 size_t 는 매개변수로써 받으면 더 좋을 텐데... 라고 생각했다면, 당신은 개발자의 자세가 이미 갖추어진 분이십니다.(라고 책에서 말해 준다...)
예제 2 : 코드 비대화를 줄인 템플릿 이용 사례, MSVC2005 Debug Mode : 40KB
이제 왜 이것이 템플릿을 사용함에 있어, 최대의 적인지를 실감하게 될 것이다. 원리로는 몇개 있지만, 예제코드 2에서 처럼, "1. 불필요한 템플릿 매개변수 선언으로 코드를 비대화 시키지 말자." 가 그 중 하나 이다. 이 원리는 어떻게 보면 항목 44의 제목과 일맥 상통하게 된다.
이것이 함수 템플릿이 아닌 클래스로 넘어가게 되면, 조금 복잡해 지는 경향이 있어, 함수로써 설명을 한것이다. 또한 비타입 매개변수(non-type parameter)에만 국한되게 이야기 했지만, 원리를 설명하기 위해서 가장 적절하기 때문이다.
클래스에게는 어떻게 적용 시킬까?(책의 경우 비타입 매개변수(non-type parameter)의 경우만 나와있다. 아마도 너무 방대한 부분이기에, 항목 44에선 원리만 알려 주는게 더 좋겠다고 생각 한듯 싶다.)
그 원리는 템플릿에 영향 받지 않는 함수 부분은 전역 함수로 빼고, 이것을 클래스 내부에서 호출 하여 처리 한다. 마찬가지로 템플릿에 영향을 받는 함수는 세세하게 분활하여, 함수 호출 식으로 처리해도 되나, 이럴 경우 오히려 더 복잡해 지기 때문에, ... 어느정도는 유들있게 하는게 더 좋을 때도 많다.
이것만은 잊지 말자!
1. 템플릿 매개변수에 종속되지 않는 코드를 파악하자.
2. 1번의 경우로 파악한것들을 함수 매개변수로 바꾸어 해결 할수 있다면, 일반 함수로 뺴고 템플릿 함수에서 일반 함수 호출로 해결을 한다.
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 49: new 처리자의 동작 원리를 제대로 이해하자. (0) | 2008.08.07 |
---|---|
항목 48: 템플릿 메타프로그래밍, 하지 않겠는가? (1) | 2008.08.05 |
항목 47: 타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자. (0) | 2008.08.05 |
항목 46: 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 (0) | 2008.08.03 |
항목 45: "호환되는 모든 타입"을 받아들이는 데는 멤버 함수 템플릿이 직방! (0) | 2008.07.31 |
항목 43: 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자. (2) | 2008.07.28 |
항목 42: typename의 두가지 의미를 제대로 파악하자. (12) | 2008.07.25 |
항목 41: 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 (0) | 2008.07.25 |
항목 40: 다중 상속은 심사숙고해서 사용하자. (0) | 2008.07.25 |
항목 39 : private 상속은 심사숙고해서 구사하자 (0) | 2008.07.19 |
최근댓글