ONRECU
article thumbnail
Published 2022. 12. 30. 15:40
[C++] Global, Static 키워드 이해 C++

헷갈리는 지점이 있어 (1) Global과 Static, (2) Static과 Virtual 두 가지로 나눠서 공부해 본다.

사실 내 업무 상 Global을 평상시에 쓰는 경우는 전혀 없다고 봐도 무방한데, 그래도 가끔 헷갈려서 정리해 봄.


Global과 Static

공통점

  • 프로그램이 죽을 때까지의 라이프사이클을 가진다.
  • 초기화하지 않으면 .bss 메모리에 자동으로 0으로 초기화되어 올라간다. (이후 추가 설명 예정)
  • 초기화도 진행하고, 이후에도 사용하는 경우 .data 메모리에 올라간다.
    • 수식이나 함수에 의해 초기화 된 경우에는 .bss로 올라간다.
    • .data 메모리는 순혈주의적인(..) 방법으로 초기화 된 경우에만 올라가는 영역.

차이점

  • 사용할 수 있는 scope이 다르다.
    • Global 변수의 경우 프로그램 내 어떤 파일에서도 사용할 수 있다. 다만 사용 시 extern 키워드를 붙여주어야 한다.
    • Static 변수의 경우 해당 파일 내에서만 사용할 수 있다.
  • Static 변수의 경우 초기화를 진행하지 않고 + 다른 곳에서 사용하지도 않으면 메모리에 아예 올라가지 않는다.
    • Global 변수의 경우엔 무조건 메모리에 올라간다.
    • Static 변수의 경우 초기화도 안하고, 사용도 안하고, 오직 선언만 했다면 메모리를 사용하지 않는다.
    • 이 특성 때문에도 global 변수나 객체 사용을 지양하는데, 프로그램이 조금만 복잡해져도 메모리 낭비가 심해지기 때문이다.

메모리 내용 다시 정리

  • 아래와 같은 코드가 있을 때, 처음 컴파일 하는 경우 들어가게되는 메모리는 아래와 같다.

  • 초기화도 하지 않고, 사용도 하지 않고 오로지 선언만 한 staticV2 변수는 메모리에 아예 잡히지 않았다가, 이후 이 변수를 사용하는 수식이나 함수가 나오게 되면 그 때 가서야 .bss 영역에 올라간다.