template라는 것은 compile time에서 template 항목이 결정되어서 컴파일되는 것을 말하죠.

즉, 실제 컴파일이전의 pre process의 단계에서 template 항목은 전부 번역이 된다고 보시면 됩니다.

데브피아에 재미있는 글이 올라 와서 테스트를 해 봤습니다.






template <int style>

void temp(int c1, int c2, int c3, int c4)

{

  for (int i1 = 0; i1 < c1; i1++)

    for (int i2 = 0; i2 < c2; i2++)

      for (int i3 = 0; i3 < c3; i3++)

        for (int i4 = 0; i4 < c4; i4++)

        {

          if (style == 1) foo1();

          else if (style == 2) foo2();

          else if (style == 3) foo3();

          else if (style == 4) foo4();

        }

}


상시 코드를 보면 다중 loop내에서 style이라는 것을 확인하는 코드가 있습니다. 이것을 template로 처리를 하게 되면 style 확인 루틴이 없어 지기 때문에 최적화가 된다는 거죠. 실제로 프로그램을 짜다 보면, 실행 최적화를 위해서 코드의 가독성을 떨어 뜨려야 하는 경우가 있는데, 이러한 경우 template를 사용하여서 최적화(코드의 가독성도 높이고 실행 최적화도 하고)를 해 준다는 얘기입니다.






이제 다음 코드를 보시기 바랍니다.


void func(int style, int c1, int c2, int c3, int c4)

{

  for (int i1 = 0; i1 < c1; i1++)

    for (int i2 = 0; i2 < c2; i2++)

      for (int i3 = 0; i3 < c3; i3++)

        for (int i4 = 0; i4 < c4; i4++)

        {

          if (style == 1) foo1();

          else if (style == 2) foo2();

          else if (style == 3) foo3();

          else if (style == 4) foo4();

        }

}


func 함수는 상의 temp와 body는 완전 똑같고 style이라는 template 항목을 변수 파라미터로 넘기는 것만 차이가 있습니다. 여기에서는 최적화가 될까요? 정답은 "된다"입니다.






이제 main 함수를 보겠습니다.


int main()

{

  temp<1>(1, 2, 3, 4);        // call       temp<1>

  temp<2>(1, 2, 3, 4);        // call       temp<2>

  temp<3>(1, 2, 3, 4);        // call       temp<3>

  temp<4>(1, 2, 3, 4);        // call       temp<4>

  temp<5>(1, 2, 3, 4);        // 코드없음

 

  func(1, 1, 2, 3, 4);        // main 함수내에서 코드 최적화

  func(2, 1, 2, 3, 4);        // main 함수내에서 코드 최적화

  func(3, 1, 2, 3, 4);        // main 함수내에서 코드 최적화

  func(4, 1, 2, 3, 4);        // main 함수내에서 코드 최적화

  func(5, 1, 2, 3, 4);        // 코드없음

 

  int style;

  scanf_s("%d", &style);

  // temp<style>(1, 2, 3, 4); // a local variable cannot be used as a non-type argument 컴파일 에러 발생

  func(style, 1, 2, 3, 4);    // style 최적화가되지않은함수호출

}


style 값을 1~5의 값을 주었을 때의 최적화 결과입니다. template를 쓰던지 일반 함수를 쓰던지 style이 상수인 경우에는 둘다 최적화를 하게 됩니다. 다만 template를 사용했을 때와 일반 함수를 사용했을 때 CALL 명령어가 들어가고 들어 가지 않는 차이는 Visual Studio 2005 PGO 정책때문인 것 같은데 본 논의에서는 그리 중요하지는 않습니다. 중요한 것은 style 확인 루틴은 둘 다(temp/func) 최적화가 된다는 거죠.


당연한 얘기지만 style을 실제 변수로 줬을 때 temp에서는 컴파일 에러가 발생하고, 일반 함수는 최적화가 되지 않은 코드가 그대로 수행이 됩니다.






결론은 "웬만한 최적화는 컴파일러가 다 알아서 해 준다"가 되겠습니다. 테스트 파일( template_test.zip ) 첨부합니다. Visual Studio 2005 Release 모드에서 컴파일하였습니다.