C++프로그래밍/C 와 C++ 기초실습

const와 메모리 구조

season97 2024. 9. 16. 11:51

※ C / C++을 이미 알고 있으나 개인적인 공부 및 복습을 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 

 하드코딩의 문제점 (상수때려박고 그런거) + const를 사용하는 이유
ㆍ 0b0000 [무적][변이][스턴][공중부양] 
                            ↓
ㆍ 0b0000 [무적][공포][변이][스턴][공중부양] 

ㆍ 이렇게 사양이 변경되면 기존의 버전이 이상해질거다...
  ㄴ 프로젝트가 클 수록 더 큰 문제가 발생할 것이다.. 따라서 리터럴상수를 저렇게 때려박는것은 좋지 않다.
                            ↓
ㆍ 그래서 한번 정해지면 절대 바뀌지 않을 것을을 const키워드를 붙히자
ㆍ const를 사용하면 가독성도 좋아지고 다른 팀원이 값을 실수로 변경하는것도 방지할 수 있다.

#include <iostream>
using namespace std;
unsigned char flag;
const int AIR = 0;
const int STUN = 1;
const int POLYMORPH = 2;
const int INVINCIBLE = 3;//const를 붙힌 값은 반드시 초기화를 해줘야된다

int main()
{
	//flag = (1 << 3);
	//flag |= (1 << 2);

	flag = (1 << INVINCIBLE); 
	flag |= (1 << POLYMORPH);

}

ㆍ 1,3 등 숫자를 박는거보다 알아보기 더 쉬워졌다.

ㆍ 이유야 더 많지만 추후 포스팅

 


 

메모리 구조

데이터 영역
1. .data (초기값이 있는 경우)

int a = 2;


2. .bss (초기값이 없는 경우)

int b;


3. .rodata(읽기전용 데이터) -> const에 포인터

const char* msg = "Hello World"

 

스택 영역

int main()
{
	//지역변수, stack에 할당
	int c = 3;
}

 

의문점 : const는 read only deta일까?

AIR과 INVINCIBLE은 데이터영역에 저장된 전역변수이자 const

ㆍ 안나온다! 근데 저 전역변수 const값을 지역변수(스택영역) 으로 데려와서 주소찍으면 또 주소가 나온다.

 

ㄴ > 사실 C++표준에서 꼭 그렇게 하란 말은 없음컴파일러 마음이다(visual studio마음이다)

 

 

 

 


 

▶ enum, const, 전처리기

#include <iostream>
using namespace std;

const int A = 1;
const int B = 2;
const int C = 3;

enum ENUM_SRP
{
	ENUM_A = 1,
	ENUM_B,
	ENUM_C
};

#define DEFINE_A 1
#define DEFINE_B 2
#define DEFINE_C 3
//디파인 키워드는 사실 사용을 권장히진 않는다
/*
코드가 많아지면 디버그 돌리기도 힘들다
ㄴ>디버깅 단계에선 이미 전처리기 단계가 지나와서 어셈블리로 데이터를 까봐도 define 매크로에 대한 정보가 나오지 않는다 
ㄴ> 마우스를 올려봐도 아무것도 안나온다.

-> enum이나 const를 사용하자. 결과물은 셋 다 똑같지만, C++프로그래머라면 define 전처리기문은 지양하자
ㄴ> enum을 0순위로 두자 (const는 초기화해야되고..)

*/

// 전처리 -> 컴파일 -> 어셈블리 -> 링크