💡
왜 전역변수가 아닌 static 키워드 변수를 사용하는가?
June 01, 2024
전역(global) 변수
라이프 타임이 프로그램이 종료될 때 까지이며, 다른 파일에서도 해당 변수에 접근이 가능하다.
정적(static) 변수
라이프 타임이 global 변수와 마찬가지로 프로그램이 종료될 때 까지이며, 반드시 static 키워드가 붙는다. 해당 변수가 선언된 scope에 따라서 접근 가능한 범위가 결정되고, 다른 파일에서 접근할 수 없다.
차이점
메모리 할당에서 global 변수는 초기화 되지 않으면 .bss 영역, 초기화 된다면 .data 영역에 할당 된다. 하지만 static 변수는 초기화 하지 않은 상태에서 메모리 자체가 잡히지 않는다.
전역 변수와 정적 변수의 초기화 시점
static 변수와 static 객체를 지역적으로 선언하고 초기화 할 때, 변수는 .data 영역에 올라간다. 객체의 경우 .bss영역에 올라간 후 dynamic initializer가 진행 되고, 생성자를 통한 초기화라면 해당 변수가 처음 수행되는 시점에 초기화가 이루어진다.
객체 초기화를 디스어셈블로 보면 해당 변수의 선언부가 수행되는 시점에 eax 레지스터의 값이 0이면 생성자 구문을 수행하고, 1이면 해당 생성자 코드를 점프해 버린다. 즉 생성자를 통해 초기화를 진행하면 메모리는 처음부터 올라가 있지만 생선자 구문은 처음 수행되는 시점에 한번만 호출되어 그 후 루프문으로 돌아와도 점프해버린다.