2009년 5월 18일 월요일

07장. 템플릿과 일반화 프로그래밍

항목 41. 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터

  • 객체 지향 프로그래밍의 축
    • 명시적 인터페이스
    • 런타임 다형성
  • 템플릿 일반화 프로그래밍의 축
    • 암시적 인터페이스 - 표현식(expression)이 유효 해야한다.
    • 컴파일 타임 다형성
  • 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원한다.
  • 클래스의 경우, 인터페이스는 명시적이며 함수의 시그니처를 중심으로 구성되어 있습니다. 다형성은 프로그램 실행 중에 가상 함수를 통해 나타납니다.
  • 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성됩니다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타납니다.

 

항목 42.typename의 두가지 의미를 제대로 파악하자.

  • template<class(typename) T> 는 같은 의미이다.
  • 템플릿 매개변수에 종속된 것
    • 의존 이름(dependent name)
    • 중첩 의존 이름(nested dependent name)
    • 중첩 의존 타입 이름(nested dependent type name)
  • 의존 이름에 typename을 붙여서 type 이란것을 알려줘야 한다.
    • 예외
    • 상속되는 기본 클래스 리스트
    • 멤버 초기화 리스트에 있는 기본 클래스 식별자
  • 특성 정보(traits) 클래스를 이용하여 타입을 생성할 수 있다.
  • 템플릿 매개변수를 선언할 때, class 및 typename은 서로 바꾸어 써도 무방합니다.
  • 중첩 의존 타입 이름을 식별하는 용도에는 반드시 typename을 사용합니다. 단, 중첩 의존 이름이 기본 클래스 리스트에 있거나 멤버 초기화 리스트 내의 기본 클래스 식별자로 있는 경우에는 예외입니다.

 

항목 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자.

  • c++의 하위 언어들 중 한 부분인 객체지향 c++에서 템플릿 c++로 옮겨 갈 때 상속 메커니즘이 끊김.
    • 기본 클래스 함수에 대한 호출문 앞에 "this->"를 붙인다.
    • using 키워드를 사용하여 유효범위를 알려준다.
    • 함수 앞에 명시적으로 기본 클래스를 알려준다.
      • 되도록 쓰지 말라( 가상 함수일 경우 동적 바인딩이 무시된다.)
  • 기본 클래스의 멤버에 대한 참조가 무효한지를 컴파일러가 진단하는 과정에서 미리 들어가는냐, 나중에 들어가느냐가 핵심이다.
  • 파생 클래스 템플릿에서 기본 클래스 템플릿의 이름을 참조할 때는, "this->"를 접두사로 붙이거나 기본 클래스 한정문을 명시적으로 써 주는 것으로 해결합시다.

 

항목 44. 매개변수에 독립적인 코드는 템플릿으로부터 분리시키자.

  • 템플릿은 코딩 시간 절약, 코드 중복 회피 두마리 토끼를 잡도록 해준다.
    • 생각없이 하면 코드 비대화를 초래할 수 있다.
  • 공통성 및 가변성 분석 을 통해 코드 중복을 막자.
  • 예제 코드 꼭 볼껏
    • template base 접근 this-> 안됨;; -_-;
  • 크기별 고정 버전
    • 컴파일 시점에 투입되는 상수 - 상수 전파(constant propagation) 최적화
  • 타입별 크기 가변 버전
    • 프로세스의 메모리 로드량 감소 - 명령어 캐쉬내 참조 지역성 향상
      • 시간적 지역성(temporal locality), 공간적 지역성(spatial locality) 향상.
  • 이진 표현 구조가 똑같을 경우 코어 부분을 한벌만 만들고, 타입별로 랩핑 하는 형태로 만들수도 있다.
  • 템플릿을 사용하면 비슷비슷한 클래스와 함수가 여러 벌 만들어집니다. 따라서 템플릿 매개변수에 종속되지 않는 템플릿 코드는 비대화의 원인이 됩니다.
  • 비타입 템플릿 매개변수로 생기는 코드 비대화의 경우, 템플릿 매개변수를 함수 매개변수 혹은 클래스 데이터 멤버로 대체함으로써 비대화를 종종 없앨 수 있습니다.
  • 타입 매개변수로 생기는 코드 비대화의 경우, 동일한 이진 표현구조를 가지고 인스턴스화되는 타입들이 한 가지 함수 구현을 공유하게 만듦으로써 비대화를 감소시킬 수 있습니다.

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기