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

위 코드를 통해서 볼 수 있듯이, 템플릿 분기로 필요한 부분만 가지고 나누어, 효율적으로, 코드를 생성한 것을 확인할 수 있다.