jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다. 3ds Max를 사용해서 게임용 3D 캐릭터를 셋업하는 방법
이를 위해 오랜 실무를 경험해 온 저자의 고급 노하우들이 공개
위 내용은 GameDevForever의 저자분들의 홍보를 위하여 운영진 자체적으로 올린 광고이며 일체의 수익이 없습니다.(밥좀사줘요~)
Posted by 터너 (TerNer)
[이전 글]
The Modernest C++ #0 - 시작하며


템플릿 메타프로그래밍 (Template Metaprogramming)

https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_%EB%A9%94%ED%83%80%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D - 위키피디아 '템플릿 메타프로그래밍'

템플릿 메타프로그래밍은 말 그대로 C++ 의 템플릿을 하나의 프로그래밍 언어로 생각하여 프로그래밍 하는 것이라고 보는게 좋습니다. C++ 의 주요 기능인 템플릿은 OS나 아키텍처에 종속되는 기능이 아니기 때문에 크로스 플랫폼에도 용이하기도 하면서 튜링 완전한 점에 있어서 아주 다양한 기능을 작성할수 있다는 점에 주목해야합니다.

위 코드는 템플릿 특수화를 이용하여 가장 간단하게 구현해본 템플릿 인수로 넘겨진 타입이 int 인지 식별하는 메타 함수 'is_int'를 구현해본 코드입니다. is_int 의 구현부를 보면 아무리 봐도 런타임에 관여할 부분은 없다고 생각이 드실것 같다고 생각된다면 맞습니다. is_int 코드는 절대 런타임 오버헤드가 발생하지 않습니다. 그저 컴파일 타임에 정해지는 값이기 때문입니다. 이처럼 템플릿 메타프로그래밍은 런타임에 관여하지 않고 컴파일 타임에 연산을 수행하기 때문에 RTTI 보다는 저렴하며 여타 OS를 지원하기도 굉장히 쉽습니다.

하지만 천하의 템플릿 메타프로그래밍에도 치명적인 단점은 존재합니다. 예를 들자면 이렇습니다 :

  • 가독성에 있어 심하게 문제가 발생합니다.

'엥? 그냥 구조체에 열거자 넣은게 뭐가 어때서..' 하시는 분들이 있으실지도 모르지만 나중에 배우시게 될 if_ 와 같은 템플릿 메타 함수는 구현하는데에는 큰 문제가 없지만 메타 함수를 호출하는데에 있어 크게 문제가 발생합니다. 곧 그 가독성의 블랙홀에 빠지시게 될것입니다. (너무 가독성의 구멍이라 헤어나올수가 없..)

  • 컴파일러에 심하게 의존적입니다.
Visual Studio 같은 경우 복잡도가 일정 이상 넘어가면 컴파일이 되지 않는 오류가 발생하는 경우가 있고 위 위키피디아 링크에서 보실수 있듯이 컴파일러마다 템플릿을 사용하는 방법이 달라서 문제가 발생하기 쉽습니다. 하지만 걱정마세요. boost 라이브러리는 그 어떤 컴파일러든 구동할수 있도록 프로그래밍할수 있다는 것을 보면 우리도 컴파일러의 제한에 영향을 받지 않는 코드를 작성할수 있을테니까요. :^)
  • 컴파일 시간이 증가할 수도 있습니다.
위에서 언급했다시피 템플릿 메타프로그래밍은 컴파일 타임에 연산을 수행하기 떄문에 컴파일 시간이 증가하는건 당연한 일 일지도 모릅니다. 중소규모 프로젝트에서는 이런 점이 크게 작용하지는 않지만 대규모 프로젝트의 경우 이 점이 큰 변수가 될수 있다는 점을 잊어서는 안됩니다.
  • (연산의 경우) 모든 연산은 상수식일 수 밖에 없습니다.
간단한 예로 어떠한 수의 팩토리얼이나 제곱의 수를 구하는 연산의 경우에는 적어도 컴파일 타임에 컴파일러가 예상할수 있는 값으로 연산을 하기 떄문에 런타임에 다른 값을 연산하는 것과 같은 행위는 할수 없습니다. 이런 점에 있어 템플릿 메타프로그래밍은 C++11 의 constexpr과 매우 유사한 형태를 가집니다.

모든 이치가 다 그렇듯이, 템플릿 메타프로그래밍도 양날의 검이라 불리울 만큼 장단점을 모두 갖추고 있는 모더니즘 설계 방식입니다. 만약에 독자분이 이를 감수하고 이용할수 있다면 이용하는 것이 굉장히 이로울 수 있습니다. 조금의 클럭사이클도 아껴야 하는 상황이라면 선택이 불가피할 수도 있을것이고 말이지요.

다음 글에서는 템플릿 메타프로그래밍을 실제로 사용하는 법과 직접 구현해보도록 하겠습니다. 정적 다형성(static polymorphism)을 이용한 분기나, 템플릿 타입을 가지고 노는 여러 메타 함수 부터 시작하여 템플릿 메타프로그래밍을 실전에 써먹어보면서 독자분들로 하여금 영감을 얻으실수 있도록 도와드리는 시간을 가질수 있도록 연재해보겠습니다.

댓글을 달아 주세요

  1. Favicon of http://gamedevforever.com 끼로 2015.10.24 17:12 신고  댓글주소  수정/삭제  댓글쓰기

    다음편은 언제 올라오나요??

  2. 2015.10.24 20:32  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of http://gamedevforever.com 터너 (TerNer) 2015.10.25 20:28 신고  댓글주소  수정/삭제

      글쎄요.. 업계에 마다 다르겠죠?

      제가 지금은 학생이라 잘은 모르겠지만 그래도 업계가 비교적 크다면 업무 분할이 잘되어있어 두가지 일을 동시에 하는 경우는 드물거라고 생각합니다.

      다만 업계가 작아 업무 분할의 의미가 거의 없는 경우에는 같이 할수 있도록 하는 경우가 있을거라고 생각합니다.

  3. Favicon of http://ldh9451.tistory.com 따분한놈 2016.01.22 19:43 신고  댓글주소  수정/삭제  댓글쓰기

    잘보고 있습니다.



티스토리 툴바