본문 바로가기
C++/기초

C++ 기초 : const

글: 시플마 2024. 3. 30.

변수를 선언할 때 'const'라는 키워드를 

붙여 해당 변수를 상수화할 수 있습니다.

 

const int형 변수 cint의 값은 100입니다.

const가 붙어 있기 때문에 cint의 값은 바꿀 수 없습니다.

 

 

아래 코드를 보면

cint에 10을 대입하려고 하자, 

"식이 수정할 수 있는 lvalue여야 합니다."라는

오류가 발생합니다.

 

여기서 lvalue는 

 

int a = 10;

 

이런 코드가 있을 때 왼쪽은 변수이므로

값을 수정할 수 있죠? 이게 바로 lvalue입니다.

 

 

반대로 값을 수정할 수 없는,

오른쪽에 있는 10은 rvalue입니다.

 

10 = 11;

 

위와 같은 코드는 이상하죠?

10이 수정할 수 없는 rvalue이기 때문이죠.

 

비록 cint는 변수이지만

const가 붙어 상수화되어 rvalue로 인식하는 것입니다.

 

 

여기서 주의할 점은 

const를 붙이면 상수로 인식할 뿐 결국 cint는 

변수이기 때문에 억지로 값을 수정할 수 있습니다.

그런 점에서 10과 같은 상수와는다르죠.

 

강제로 수정해 보겠습니다.

 

int형 포인터 변수 pInt를 선언하고 cint의 주솟값을 

저장합니다. cint는 const int이므로 주솟값을 그냥

넣을 수는 없고 강제로 변환하여 저장합니다.

 

그리고 저장된 주소로 직접 접근하여 5를 대입합니다.

 

이후 cint 값을 출력했습니다.

 

 

그런데 100이 출력됩니다.

 

하지만 로컬 창에서도 볼 수 있듯이

실제 cint에는 5가 대입되었습니다.

 

 

그럼 printf를 통해 cint 값을 출력했을 때

100이 나왔을까요?

 

아래 그림을 봅시다.

 

CPU는 레지스터라는 기억 장소를 갖고 있습니다.

const int형 cint의 값이 5로 바뀌면서 기존 값인 100은

레지스터에 저장됩니다.

 

CPU는 이 값을 가져와 출력한 것입니다.

 

cint에서 직접 값을 가져와 출력하지 않고

레지스터에서 가져온 이유는 최적화 때문입니다.

 

CPU : "변수 cint는 const int형이잖아. 그러니 값이 바뀔 수 없잖아?

그러니까 굳이 cint까지 가서 찾아오지 않고 레지스터에서 빠르게 가져올게.

만약 cint의 값이 100이 아닌 다른 값이라면 네 잘못이야."

 

 

이런 최적화를 거치지 않고 진행하려면

 

휘발성을 의미하는

'volatile' 키워드를 붙이면 됩니다.

 

해당 변수를 지칭했다면

레지스터를 이용하지 말고

무조건 해당 변수의 값을 

직접 확인하라는 것이죠.

 

실행 결과 '5'가 출력되네요.

 

 


 

 

 

 

const int형인 cint는 상수화가 되었으므로

값이 바뀌면 안되지만 강제로 바꿀 수 있다는 점에서 

일반적인 상수와는 다르다는 것을 알 수 있습니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB

 


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : const 포인터 예시  (0) 2024.03.31
C++ 기초 : const 포인터  (0) 2024.03.31
C++ 기초 : 포인터 문제 풀이와 해답  (0) 2024.03.30
C++ 기초 : 포인터 배열  (0) 2024.03.30
C++ 기초 : 포인터  (0) 2024.03.29