현재 진행중인 프로젝트 내에서 Const를 자주 선언하게 되어, Const를 확실하게 알고 넘어가야겠다라는 생각이 들어서 

Const를 따로 공부하였습니다.

 

Const를 본격적으로 알아보기 이전에 

컴파일러는 일반적으로 변수를 최적화할때, 해당 변수가코드의 어떤 부분에서도 변경되지 않는다고 
판단되면 레지스터에 캐싱하거나, 불필요한 메모리 접근을 생략합니다.
이때 , volatile을 사용하면 컴파일러는 

1.해당 변수를 레지스터에 캐싱하지 않고, 항상 메모리에서 읽고 쓰도록 강제합니다.
2. 변수의 값이 코드에서 보이지 않는 방식으로도 변경될 수 있음을 고려합니다.

 

다음의 예시를 한번 보겠습니다.


예시코드 : 

const int consINt = 100;

pInt = (int*) &consINt ;
*pInt = 300;
printf("%d",constINT);


consINt를 선언함과 동시에 const로 해버렸기 때문에 해당 const 변수를 레지스터에 캐싱하게 됩니다.
그 상황에서 300으로 바꿔버리면  레지스터에 저장된 값은 바뀌지 않기 때문에 출력값이 100이 나오게 됩니다

 

하지만 이 상황에서 레지스터에 등록하지말고 메모리에서 직접 찾아쓰라고
volatile을 선언해주면 정상적으로 값이 출력됩니다.

volatile const int consINt = 100;

pInt = (int*) &consINt ;
*pInt = 300;
printf("%d",constINT);

 

현재 과제의 요구사항 중 const를 많이 사용하는데, 그 중 const포인터의 2가지 용법에 대해 먼저 알아보겠습니다.


1.가리키고 있는 장소를 바꿀건지

 

// 가리키고 있는 대상을 상수화 시키는 것 (const 포인터)

const int* pConstInt = &a;
*pConstInt = 100; // compile Error

pContstInt = &b; // 가능 
cuz ) 가리키고 있는 대상을 상수화시켰기 때문에


2. 가리키고 있는 자기 자신을 상수화를 시킬건지
 - 이경우 바꾸는 대상을 바꿀수 없다

 // 포인터 자기 자신을 상수화 시키는 경우 (포인터 CONST)

int* const pIntConst = &a;
pIntConst = &b ; // compile Error


3. 둘다

//가리키고 있는 대상을 바꿀수 없고, 그 대상의 값도 바꿀 수 없다.
 cont int* const pConstIntConst = nullptr;



그렇다면 우리는 왜 const가 필요한가?

 

함수마다 인자 값에  F(int a) 라고 변수의 값을 넣게 되면

지역스택에 복사해서 가져가는데 , 
그 복사하는 변수가 메모리가 크면 부담이 된다.

따라서 그 해당 변수를 복사가 아닌 해당 메모리에 접근하여 참조 및 변경하는 방법은 여러가지가 있다.

이 중 포인터 방법을 사용하게되면 해당 포인터가 값을 변경할 수 있는 위험이 있다.

따라서 해당 포인터가 값을 변경할 수 없게 const를 써준다

 

 물론 const를 선언해도 강제 형변환을 통해 값을 바꿀 수 있다는 위험도 있지만

해당 코드의 목적에 대해 생각을 해보면

해당 변수의 값을 건들게 되면 전체적인 문제가 생길 수 있기 때문에 const로 막는 목적이 있을 것이다.

 


Cf ) Ctrl+shift + Space = 함수 원형을 보는 단축키

'C++ > C++ 용어 정리' 카테고리의 다른 글

GOF :: 데코레이터 패턴  (0) 2025.01.09
GOF :: 싱글톤 패턴  (0) 2025.01.09
생성자  (0) 2024.12.24

+ Recent posts