C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[184] 전연 객체 변수는 제대로 생성이 되는가?
이경문 [gilgil] 16721 읽음    2009-02-13 11:08
전역 변수의 사용은 참으로 애매호모한 것 같습니다.
로그를 찍는 모듈, 스레드와 관련된 모듈 등에서
초기화를 자동으로 호출되어 질 수 있도록
전역 객체로 선언을 해서 사용을 했었는데
예전에 하나의 프로젝트에 추가시켜서 사용하던 cpp 모듈을
별도의 static library로 분리해서 사용을 하는데,
작동이 다르게 되어 져서 테스트를 한번 해 보았습니다.

C/C++에서는 보통 다음과 같이 실행이 됩니다.

void main()
{ <--- (1) 전역 객체들의 생성자가 호출된
...
...
} <--- (2) 전역 객체들의 해제자가 호출됨

그런데 똑같은 소스를 가지고 프로젝트 구성을 어떻게 하느냐에 따라
실행 결과가 달라 질 수 있음을 확인할 수 있습니다.

설명이 길어 져서 별도의 문서로 작업하였습니다.
첨부하는 zip 파일내의 readme.doc을 참고하시기 바랍니다.

향후 static library 프로젝트를 만들때
본 문서에서 얘기하고 있는 부분을 알아 두시면
저같이 헛고생(?)하지는 않을 것입니다.

1. cpp 파일이 exe 파일을 생성하는 프로젝트에 직접 추가되는 경우 해당 cpp 파일의 전역 객체는 무조건 생성이 되고 해제가 됩니다.

2. 반면에cpp 파일이 exe 파일 프로젝트에 직접 링크가 되는 것이 아니라, 별도의 static library의 형태로 간접적으로 링크가 되는 경우, 해당 cpp 파일의 코드가 최종 빌드되는 exe 모듈에 링크가 되는지에 대한 여부는 링커가 알아서 결정을 합니다.

3. exe 파일 빌드 과정에서static library에 속해 있는cpp 파일 모듈의 어떠한 작은 코드라도 exe 파일을 빌드하는데 포함되어 져야 한다면 (cpp 파일과 관련된 header파일의 임의 interface를 main 에서 호출), 해당 cpp 파일은 자연스럽게 링크가 되고, cpp 파일내의 전역객체는 자연스럽게 생성되고 해제가 됩니다.

4. 결론적으로 static library에 속해 있는 (내가 쓰지도 않는) 모듈이 아무리 많다 하더라도, main에서 호출되지 않는 모듈은 자연스럽게 링크 과정에서 빠지게 되므로, 큰 규모의 static library 링크에 대한 부담은 그리 걱정하지 않아도 됩니다.
Lyn [tohnokanna]   2009-02-13 11:11 X
음 뭐 그냥 감으로 알고 있던 부분이네요 : ) 정확히 테스트를 해보진 않았지만

+ -

관련 글 리스트
184 전연 객체 변수는 제대로 생성이 되는가? 이경문 16721 2009/02/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.