Static, Global Variables

5 분 소요

Initializations

기본적 개념

정적 변수 초기화의 안정성에 대해서

정적 변수의 초기화에 대해서

전역 혹은 정적 변수가 저장되는 영역 - Data -

  • Data 영역은 3가지로 나뉨
  • .rodata
    • 읽기 전용으로 상수 문자열, 상수 리터럴 등이 저장됨
  • .data
    • 초기화 된 값들이 저장되는 영역
    • exe 파일에 실행 이미지가 저장되어 프로세스 시작시 복사됨
  • .bss(Blocked State Symbol)
    • 초기화 되지 않은 전역/정적 변수가 저장됨

CRT

Static Local Variable 의 초기화에 대해서

  • 초기화 여부를 판단하는 정적변수를 만들어서 어셈블리 단위에서 한번만 초기화되게 체크함.
  • 컴파일러에 따라서 Mutex 를 넣어서 Thread 안정성을 보장할 수도 아닐수도 있음
int x, y;
int F(){ return x + y; }

int main()
{
    x = 10; y = 15;
    static int a = F();
    cout << a;   // print 25
}
  • dll 동작에 대해서

  • dllmain 을 호출하기 전에 crt initialze 가 이루어져 정적/전역 변수가 초기화 됨.

  • 암시적 Link
    • 실행파일내에 dll Module에 대한 참조가 있으면 프로그램이 실행될 때 Module 을 로딩함.
    • .lib 파일이 필요함.
    • 참조가 없으면 Link 가 이루어지지 않으므로 주의
  • 명시적 Link
    • main 이후에 직접 함수를 호출해서 Module 을 로딩함
    • .dll 만 있으면 됨

Dll 에 Static Lib 과 연결시

  • Singleton 처럼 전역 변수는 복사본이 들어오므로 기피해야함

댓글남기기