전체 코드

#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;
}

🔗 1️⃣ const 상수란?

  • constant(상수)의 약자
  • 한번 정해지면 절대 바뀌지 않는 값을 의미
  • 반드시 초기화가 이루어져야 함
  • 보통 매직 넘버를 없애기 위해 사용 (가독성 + 유지보수성 강화)
const int MAX_HP = 100;  // 최대 체력
const float CRITICAL_RATE = 0.2f;  // 치명타 확률

📍 2️⃣ 상수의 메모리 위치

메모리 영역설명예시
.rodata읽기 전용 데이터 영역const char* msg = "Hello";
.data초기값 있는 전역 변수int a = 10;
.bss초기값 없는 전역 변수int b;
스택지역 변수int c = 3; (main 안에 선언)
동적 할당 변수int* p = new int;

✔️ 메모리 구조 개념도

[코드 영역]        : 실행 코드 (함수, 명령어 등)
[.rodata 영역]     : 읽기 전용 데이터 (const 상수, 문자열 리터럴 등)
[.data 영역]       : 초기화된 전역/정적 변수
[.bss 영역]        : 초기화 안된 전역/정적 변수
[힙 영역]          : 동적 할당된 메모리
[스택 영역]        : 함수 호출 시 생성되는 지역 변수, 매개변수 등

🔎 4️⃣ 디버깅 & 디어셈블리 분석 포인트

① 전역 변수 위치 확인 (a, b)

  • a는 .data에 위치
  • b는 .bss에 위치
.data 영역: 초기화된 전역변수
.bss 영역: 초기화 안된 전역변수

② 문자열 리터럴 위치 확인 (msg)

  • 문자열 리터럴 "HelloWorld"는 .rodata에 위치
  • 포인터 msg.data에 저장 (초기값 있음)

③ 지역 변수 위치 확인 (c)

  • main 함수 안에 선언된 c스택에 저장

④ 플래그 변경 흐름 확인

flag = (1 << INVINCIBLE);

👉 디어셈블리

mov byte ptr [flag], 0b00010000  ; 2^4 = 16
flag |= (1 << POLYMORPH);

👉 디어셈블리

or byte ptr [flag], 0b00000100  ; 기존 flag와 OR 연산

🧰 5️⃣ 메모리 구조 상세 정리표

변수명초기화위치예시
전역 aO.dataint a = 2;
전역 bX.bssint b;
문자열 msgO.rodataconst char* msg = "Hello";
지역 cO스택int c = 3;
동적 할당Xint* p = new int;

⚡ 6️⃣ 비트 플래그의 메모리 절약 효과

  • 각 상태를 1비트로 관리 (8가지 상태 = 1바이트)
  • 효율성 극대화
  • 상태별로 상수 정의 (가독성 + 유지보수성 강화)
const int AIR = 0;      // 0번째 비트
const int STUN = 1;     // 1번째 비트
const int POLYMORPH = 2;  // 2번째 비트

🧵 7️⃣ 비트 마스크 활용법 정리

상황코드
상태 추가`flag
상태 제거flag &= ~(1 << POLYMORPH)
상태 확인(flag & (1 << POLYMORPH)) != 0

💡 8️⃣ 추가 팁 (디버깅 시 확인법)

🔎 디버깅 실행 후,
조사식 창에 아래처럼 입력해보면 확인 가능

&flag  // 주소 확인
flag   // 현재 비트 값 확인 (10진수로 나옴)

✅ 9️⃣ 실습 포인트 정리

실습내용
메모리 영역 확인각 변수의 주소와 영역을 직접 확인
비트 플래그 조작비트 ON/OFF, AND/OR 확인
디어셈블리 분석플래그 조작 명령어 흐름 확인

📜 10️⃣ 총정리 한눈에 보기

키워드설명메모리 위치
const읽기 전용 상수.rodata (or 스택)
초기화된 전역값 있음.data
초기화 없는 전역값 없음.bss
지역 변수함수 내 선언스택
동적 할당new 연산자
문자열 리터럴"Hello".rodata

🚀 11️⃣ 핵심 복습 퀴즈 (스스로 체크)

❓ const 상수는 항상 .rodata에 저장된다?
아니다! (컴파일러 최적화에 따라 다름)

❓ 지역 const 상수는 어디에 저장될 가능성 높을까?
스택

❓ 전역 const 포인터는 어디?
포인터 자체는 .data, 문자열은 .rodata

❓ 비트 플래그로 상태 관리하는 장점은?
메모리 절약 + 빠른 연산


💬 12️⃣ 마무리

이 자료는 상수, 메모리 구조, 비트 플래그라는 3가지 핵심 개념을
이론+코드+메모리맵+디어셈블리로 완벽하게 엮은 궁극 가이드입니다.
매일 이 자료 복습하면 메모리 구조 전문가로 성장 가능합니다!
더 심화 설명 원하거나 실습 추가 필요하면 바로 말씀 주세요. 💪🔥


profile
李家네_공부방

0개의 댓글