정적 변수 고찰

라디·2022년 8월 11일
0

정적 변수(static) 을 사용하다가
당연하게 런타임에 초기화 가능한 값을 넣어주었는데..

대학교 다닐 때 강의에서 들었던 기억으로는, (대부분 c언어)
정적 변수는 컴파일 타임에 초기화 된다는 기억이 갑자기 생각이 났다.

그런데 어떻게 런타임에 초기화가 가능한 값이 대입이 가능한가.. 해서
검색을 해 보았더니, dart공식 문서에는 동적초기화가 된다고 써 있네요.. ?.?
(런타임에, 정적 변수가 사용되는 시점에 초기화)

내 기억이 잘못됬나.. 해서 c언어 기준으로 다시 구글링 시작..

어떠한 블로그에서 c코드를 디스어셈블리 하여 분석한 글을 보았다.
(참조 : - )

해당 글에 따르면,, 컴파일 타임에 초기화 가능한 값들은 컴파일 타임에,
컴파일 타임에 불가능한 값들은 dart와 마찬가지로 동적초기화가 된다고 한다!!
(그 기능/불가능 은 어떻게 판단되는거지..? 기준이 뭔지는 잘 모르겠다)

여튼.. 나도 따라서 해 보며 공부!!

알게 된 것.

  • data 영역에 bss라는 영역이 따로 나뉘어진다.
  • bss영역은 zerofill(값 0으로 초기화되어 변수가 있다는것만 알려주는 적은 메모리를 차지하는 영역)

그런데.. 디스어셈블리된 코드를 보니
DATA,common
DATA,bss

이렇게 두 개가 나오는데..
data 영역이 data, bss 로 나뉘는게 아니라

common , bss 로 나뉘는 듯 하다!

그래서 val4,5는 bss영역에 잘 들어가는 듯 하고..

Q1

근데 val6 는 common영역인듯 한데 zerofill ...?

Conclusion

  • 언어마다 정적 변수에 값타임이 들어가도 초기화 시점은 컴파일타임이 아닐 수 있는 것 같다. (:=언어마다 다르다)
  • 아직 잘 모르겠다.. 헷
profile
피아노 배우고 싶다

0개의 댓글