{
왜 일까? 일단 컴파일 단위란 개념과 초기화 의존성이란 개념을 알아야 한다.
컴파일 단위란?
컴파일러가 코드를 컴파일 할 때. 현재 파일만 보는 상태이다. 이런 상태에서 그 파일만 컴파일 하는데, 이렇게 파일 단위로 컴파일하는 것을 컴파일 단위 라 불르고 A 파일과 B 파일이 컴파일 되는 것을 "컴파일 단위 사이" 에 놓여 있다고 할 수 있다.
개념은 이건데, 컴파일러 마다 컴파일 단위가 다르기 때문에, 파일 단위가 컴파일 단위라고 확정 지을 수도 없는 노릇이다. 컴파일러 매뉴얼을 한번도 읽어 본적이 없어서 MSVC가 무엇을 컴파일 단위로 보는지도 모르겠다. ; )
초기화 의존성이란?
A가 초기화 되어야만, B를 정상적으로 초기화 할 수 있을 때, 우리는 B는 A의 초기화에 의존적이다.. 라고 말할 수 있다. 즉, B는 초기화 의존성을 가지고 있다고 할 수 있다. 결국 A가 초기화 되지 않아 쓰래기 값을 가지고 있을 때, 이 값으로 B를 초기화 하면 역시 .. 문제가 생긴다.
본론으로 돌아와서, 왜 컴파일 단위 사이의 초기화 의존성을 앱애라고 할까?
전역 변수의 경우, 컴파일 타임에 값이 결정 된다. 컴파일은 단위별로 이루어 진다. 만약 B단위가 먼저 컴파일 될 때는 A단위가 아직 컴파일 되지 않았기 때문에 쓰래기 값으로 초기화된다. 컴파일러에 잘아는 사람이여서 컴파일 단위를 예측 하여 피해갈 순 있지만, 여러 컴파일러로 컴파일 될 수 있기 때문에, 결코 믿을 수 있는 것만은 아니다.
쉽게 정리하자면, 컴파일 번역 단위가 워낙 랜덤하다 보니, 컴파일 단위 사이의 초기화 의존성을 두면, 문제가 생길 수 있다는 것이다.
해결 방법으로는 "Effective C++ 과 Exceptional C++ "에서 컴파일 단위 초기화 의존성 변수, 즉 전역 변수는 지역에서 초기화 시키라고 한다. 즉, 함수에서 초기화 시키고 그 리턴값으로 사용 하라는 것인데, 전역적 접근을 위한 싱글턴이 바로 이 방법을 응용한 것이라 할 수 있다.
자, 자세한 방법은 내 블로그에서 찾으면 나온다. ; )
}
최근댓글