#include <iostream>
using namespace std;
// .data 영역에 저장 (초기값 있음)
int a = 2;
// .bss 영역에 저장 (초기값 없음)
int b;
// .rodata 영역 (읽기 전용 상수)
const char* msg = "HelloWorld";
// 비트 플래그용 전역 변수 (.bss)
unsigned char flag; // 1바이트 상태 저장용
int main()
{
// 스택 영역에 저장 (지역 변수)
int c = 3;
// 상태 플래그 정의 (const 상수로 상태 표현)
const int AIR = 0;
const int STUN = 1;
const int POLYMORPH = 2;
const int FEAR = 3;
const int INVINCIBLE = 4;
// 비트 플래그로 상태 관리
flag = (1 << INVINCIBLE); // 무적 상태 ON
flag |= (1 << POLYMORPH); // 변이 상태 추가
// 특정 상태 확인
bool invincible = (flag & (1 << INVINCIBLE)) != 0;
bool stunOrInvincible = (flag & ((1 << INVINCIBLE) | (1 << STUN))) != 0;
cout << "무적: " << invincible << ", 무적 또는 스턴: " << stunOrInvincible << endl;
return 0;
}
const 상수란?const int MAX_HP = 100; // 최대 체력
const float CRITICAL_RATE = 0.2f; // 치명타 확률
| 메모리 영역 | 설명 | 예시 |
|---|---|---|
.rodata | 읽기 전용 데이터 영역 | const char* msg = "Hello"; |
.data | 초기값 있는 전역 변수 | int a = 10; |
.bss | 초기값 없는 전역 변수 | int b; |
| 스택 | 지역 변수 | int c = 3; (main 안에 선언) |
| 힙 | 동적 할당 변수 | int* p = new int; |
[코드 영역] : 실행 코드 (함수, 명령어 등)
[.rodata 영역] : 읽기 전용 데이터 (const 상수, 문자열 리터럴 등)
[.data 영역] : 초기화된 전역/정적 변수
[.bss 영역] : 초기화 안된 전역/정적 변수
[힙 영역] : 동적 할당된 메모리
[스택 영역] : 함수 호출 시 생성되는 지역 변수, 매개변수 등
a는 .data에 위치b는 .bss에 위치.data 영역: 초기화된 전역변수
.bss 영역: 초기화 안된 전역변수
.rodata에 위치msg는 .data에 저장 (초기값 있음)c는 스택에 저장flag = (1 << INVINCIBLE);
👉 디어셈블리
mov byte ptr [flag], 0b00010000 ; 2^4 = 16
flag |= (1 << POLYMORPH);
👉 디어셈블리
or byte ptr [flag], 0b00000100 ; 기존 flag와 OR 연산
| 변수명 | 초기화 | 위치 | 예시 |
|---|---|---|---|
| 전역 a | O | .data | int a = 2; |
| 전역 b | X | .bss | int b; |
| 문자열 msg | O | .rodata | const char* msg = "Hello"; |
| 지역 c | O | 스택 | int c = 3; |
| 동적 할당 | X | 힙 | int* p = new int; |
const int AIR = 0; // 0번째 비트
const int STUN = 1; // 1번째 비트
const int POLYMORPH = 2; // 2번째 비트
| 상황 | 코드 |
|---|---|
| 상태 추가 | `flag |
| 상태 제거 | flag &= ~(1 << POLYMORPH) |
| 상태 확인 | (flag & (1 << POLYMORPH)) != 0 |
🔎 디버깅 실행 후,
조사식 창에 아래처럼 입력해보면 확인 가능
&flag // 주소 확인
flag // 현재 비트 값 확인 (10진수로 나옴)
| 실습 | 내용 |
|---|---|
| 메모리 영역 확인 | 각 변수의 주소와 영역을 직접 확인 |
| 비트 플래그 조작 | 비트 ON/OFF, AND/OR 확인 |
| 디어셈블리 분석 | 플래그 조작 명령어 흐름 확인 |
| 키워드 | 설명 | 메모리 위치 |
|---|---|---|
const | 읽기 전용 상수 | .rodata (or 스택) |
| 초기화된 전역 | 값 있음 | .data |
| 초기화 없는 전역 | 값 없음 | .bss |
| 지역 변수 | 함수 내 선언 | 스택 |
| 동적 할당 | new 연산자 | 힙 |
| 문자열 리터럴 | "Hello" | .rodata |
❓ const 상수는 항상 .rodata에 저장된다?
→ 아니다! (컴파일러 최적화에 따라 다름)
❓ 지역 const 상수는 어디에 저장될 가능성 높을까?
→ 스택
❓ 전역 const 포인터는 어디?
→ 포인터 자체는 .data, 문자열은 .rodata
❓ 비트 플래그로 상태 관리하는 장점은?
→ 메모리 절약 + 빠른 연산
이 자료는 상수, 메모리 구조, 비트 플래그라는 3가지 핵심 개념을
이론+코드+메모리맵+디어셈블리로 완벽하게 엮은 궁극 가이드입니다.
매일 이 자료 복습하면 메모리 구조 전문가로 성장 가능합니다!
더 심화 설명 원하거나 실습 추가 필요하면 바로 말씀 주세요. 💪🔥