gimmesilver's blog

Agbird.egloos.com

포토로그



싱글톤 템플릿과 VC++6.0 컴파일러 문제...2 프로그래밍

며칠 전 싱글톤을 적용하던 중 이상한 문제가 발생해서 이런 글을 쓴적이 있다.

그 문제에 대해서 오늘 여러 가지 테스트를 하던 도중 이런 현상을 발견했다.

class SingleToneTest
  {
  SingleToneTest() { std::cout << "SingleToneTest's ctor!!! "; }
  friend SingleToneTest* GetSingleton();
  };

template <class T>
T* GetSingleton()
  {
  static T t;
  return &t;
  }

template <class T>
class SingleToneTest2
  {
  public:
  static SingleToneTest2* GetSingletone()
      {
      static SingleToneTest2 inst;
      return &inst;
      }

  private:
      SingleToneTest2() { std::cout << "SingleToneTest2's ctor!!! "; }

  };

template <class T>
struct Test
  {
  Test()
      {
      T* test = GetSingleton<T>();
      SingleToneTest2<T>* test2 = SingleToneTest2<T>::GetSingletone();
      }
  };

이론상으로 SingleToneTest 객체와 SingleToneTest2 객체는 Test객체가 아무리 많이 생겨도 프로그램 전체에서 단 한 번만 발생되어야 한다. 그러나 VC++6.0에서 릴리즈 모드에 maximize speed optimization 옵션을 주고 Test객체를 static 전역객체로 여러 개 생성할 경우 SingleToneTest객체는 단 한 번만 생성되지만 SingleToneTest2 객체는 여러 개가 생성된다.
이유는 정확히 모르겠지만 아마도 최적화 시 함수 템플릿과 클래스 템플릿의 인스턴스화 과정에 차이가 있는 것 같다. 결국 예전에 그 문제는 함수 템플릿을 이용해서 해결하긴 했다. 나중에 VC++7.x 버전이나 기타 다른 컴파일러에서도 테스트를 해봐야 겠다.

덧글

  • Rica 2006/03/31 13:23 # 삭제 답글

    컴파일러가 함수를 인라이닝하기 때문인 것 같습니다. 인라인되는 함수 안의 static은 함수가 인라인될 때마다 컴파일 단위(obj) 안에 실체를 하나씩 잡게 됩니다.

    이게 표준인지 VC6의 특성인지는 잘 모르겠네요. :)
  • silverbird 2006/03/31 15:30 # 답글

    // to Rica
    아하 그렇군요...다른 분이 VC7에서는 이런 현상이 없다고 한것으로 미루어 볼 때 VC6의 특성인 것 같습니다. 주의해야 겠습니다.
댓글 입력 영역