[C++] 상수(const)와 데이터 영역

👻 상수(const)

상수변수들 중 한 번 정해지면 절대 바뀌지 않는 값을 의미한다. constant의 약자인 const를 사용하고 초기값을 반드시 지정해야 한다.

const int AIR = 0;
const int STUN = 1;
const int POLYMORPH = 2;
const int INVINCIBLE = 3;

👻 데이터 영역

변수를 설정하고 프로젝트를 빌드하게되면 메모리에 값이 올라가게 되는 건 알고있다. 하지만 변수의 특성에 따라 올라가는 영역이 조금씩 다르다. 그 차이에 대해서 정리해보자.

Alt Text

위의 그림은 메모리 구조이다. Data 영역이 크게 세 부분 으로 나뉘는 걸 알 수 있다.


🌱 .data 영역

초기값이 있는 경우 변수가 저장되는 곳이다. 우리가 일반적으로 변수를 선언하고 초기값까지 설정해주면 해당 변수는 이 영역에 저장된다.

int a = 2;

🌱 .bss 영역

초기값이 없는 경우 변수가 저장되는 곳이다. .data 영역에 저장되는 변수와 마찬가지로 선언할 수 있고, 초기값을 설정해주지 않으면 해당 변수는 이 영역에 저장된다.

int b;

🌱 .rodata 영역

ro는 readonly이고 읽기 전용 데이터를 뜻한다. 포인터 같은 변수가 해당 영역에 저장된다.

💡 상수도 저장될까?
딱히 정해져있진 않다고 한다. C++ 표준에서 꼭 그렇게 하라는 말이 없기 때문에 그냥 컴파일러(VS) 마음이라 생각하면 된다. 대부분은 .rodata 영역에 잡히겠지만 경우에 따라 컴파일러가 아예 상수로 치환할 수도 있다.

const char* msg = "Hello World";

위의 세가지 변수를 설정하고 브레이크 포인트를 잡은 후 디버그를 실행하면 각 변수의 메모리 주소를 알 수 있다.

main 함수 안에 선언된 변수는 스택 영역에 저장된다. (상수도 포함)


👻 글을 마치며

이번 시간을 끝으로 데이터를 만져보는 시간은 끝이 났다. 마지막으로 상수에 대해 배우고 메모리와 연결하여 데이터가 어디에 어떻게 저장되는지까지 알 수 있었다. 아직까지 디버깅 하는 게 쉽지는 않은 것 같다. 조사식 활용이 어려워 😭


출처
인프런 Rookies님 강의

Categories:

Updated:

Leave a comment