Info
해당 글에서는 Templete과 switch case를 사용한 최적화 케이스에 대해서 소개한다.
먼저 다음 코드를 확인해보자.
#include <iostream>
// 1) 방향 열거형 정의
enum class Direction { EAST, WEST, NORTH, SOUTH };
// 2) 컴파일 타임에 분기 처리하는 템플릿
template<Direction D>
struct Slide {
// 컴파일 타임 분기: D 가 정해지면 나머지 case 는 제거됩니다.
static int getTarget() {
switch (D) {
case Direction::EAST: return -800;
case Direction::WEST: return +800;
case Direction::NORTH: return +600;
case Direction::SOUTH: return -600;
}
return 0; // (실제로는 모든 열거형을 커버하므로 여기엔 도달하지 않음)
}
};
int main() {
std::cout << "EAST target: " << Slide<Direction::EAST>::getTarget() << "\n";
std::cout << "WEST target: " << Slide<Direction::WEST>::getTarget() << "\n";
std::cout << "NORTH target: " << Slide<Direction::NORTH>::getTarget() << "\n";
std::cout << "SOUTH target: " << Slide<Direction::SOUTH>::getTarget() << "\n";
return 0;
}
처음에 이러한 코드를 봤을 때, 템플릿의 일반적인 동작에 따라서 코드의 양이 비대하게 커질 것으로 예상했는데 컴파일된 코드는 그렇지 않았다.
아래 어셈블리 코드를 보자.
0000000140003330 <_ZN5SlideIL9Direction0EE9getTargetEv>:
140003330: 55 push rbp
140003331: 48 89 e5 mov rbp,rsp
140003334: b8 e0 fc ff ff mov eax,0xfffffce0
140003339: 5d pop rbp
14000333a: c3 ret
14000333b: 90 nop
14000333c: 90 nop
14000333d: 90 nop
14000333e: 90 nop
14000333f: 90 nop
0000000140003340 <_ZN5SlideIL9Direction1EE9getTargetEv>:
140003340: 55 push rbp
140003341: 48 89 e5 mov rbp,rsp
140003344: b8 20 03 00 00 mov eax,0x320
140003349: 5d pop rbp
14000334a: c3 ret
14000334b: 90 nop
14000334c: 90 nop
14000334d: 90 nop
14000334e: 90 nop
14000334f: 90 nop
0000000140003350 <_ZN5SlideIL9Direction2EE9getTargetEv>:
140003350: 55 push rbp
140003351: 48 89 e5 mov rbp,rsp
140003354: b8 58 02 00 00 mov eax,0x258
140003359: 5d pop rbp
14000335a: c3 ret
14000335b: 90 nop
14000335c: 90 nop
14000335d: 90 nop
14000335e: 90 nop
14000335f: 90 nop
0000000140003360 <_ZN5SlideIL9Direction3EE9getTargetEv>:
140003360: 55 push rbp
140003361: 48 89 e5 mov rbp,rsp
140003364: b8 a8 fd ff ff mov eax,0xfffffda8
140003369: 5d pop rbp
14000336a: c3 ret
14000336b: 90 nop
14000336c: 90 nop
14000336d: 90 nop
14000336e: 90 nop
14000336f: 90 nop위 코드를 통해서 볼 수 있듯이, 템플릿 분기로 필요한 부분만 가지고 나누어, 효율적으로, 코드를 생성한 것을 확인할 수 있다.