아래의 블로그 글을 보고 작성한 글입니다.

 

https://hwan-shell.tistory.com/215

 

C++] const_cast에 대해서...

모든 언어에는 형변환이 있습니다. C++에선 다양한 형번환 객체들을 제공합니다. 1. static_cast = https://hwan-shell.tistory.com/211 2. dynamic_cast = https://hwan-shell.tistory.com/213 3. const_cast 4. reinterpret_cast = https://

hwan-shell.tistory.com


const char* IP = "192.168.204.116"

*IP  값을 수정하려고 const 성을 없애는 const_cast 를 사용했고.

아래와 같이 코드를 썻는데 너무 쉽게 되는게..  뭔가 모를 불안함이 엄습해와서 const_cast를 더 알아보기로했다.

 

auto temp = const_cast<char*>(IP);

 


1. const로 선언된 포인터만 const를 풀어줄 수 있다.
2. 포인터가 아닌 일반 변수의 const는 풀어줄 수 없다.
3. 함수 포인터, 맴버 함수에 대한 const는 풀어줄 수 없다.
 
int main() {
    const int num = 10;
    const int* p = &num;
    int* p2 = const_cast<int*>(p);
    *p2 = 30;
    printf("&num = %x, p = %x, p2 = %x\n", &num, p, p2);
    printf("num = %d, *p = %d, *p2 = %d\n", num, *p, *p2);

    return 0;
}

 

웃긴게 num 의 값을 출력해보면 num 만 값이 10인것을 알 수 있다.

 

어찌 된 일일까??
num , p ,p2가 가 가리키는 주소값은 다 동일한데 말이다...

 

 

위 블로그의 주인장님은 디어셈블리 코드까지 보면서 알아봤는데

 

결론은 num , p , p2 모두 같은 값을 바라보고 있고 실제로 num의 값은 30으로 바뀐다.

 

근데 printf 할때 값자기 10으로 바뀐다는것이다.

 

 

이에 대한 명확한 답이 답글에 달려있었다.

 


[ 댓글 ]

 

리터럴 상수를 const 변수에 대입하여 사용했기 때문에 컴파일러의 최적화가 이루어집니다.
num은 정상적으로 20을 담고 있으나, 컴파일 과정에서 printf의 본문이 num을 출력하는 것이 아니라 10을 출력하는 코드로 최적화되어버린 것이죠.
사실상 코드를 다음과 같이 작성한 것과 다름이 없습니다.

int main() {
const int num = 10;
int* p = const_cast<int*>(&num);
int i = 100;
*p = 20;

printf("&num = %x, p = %x, &i = %x\n", &num, p, &i);
printf("num = %d, *p = %d, i = %d\n", 10, *p, i);


return 0;
}

컴파일러의 의도치 않은 최적화를 막으려면, 최적화 옵션을 끄고
const 변수에 리터럴이 아닌 값을 대입하면 됩니다.

다음처럼요.

#include <cstdio>

int main() {
int a = 10;
const int num = a;
int* p = const_cast<int*>(&num);
int i = 100;
*p = 20;

printf("&num = %x, p = %x, &i = %x\n", &num, p, &i);
printf("num = %d, *p = %d, i = %d\n", num, *p, i);


return 0;
}

이제 num = 20, *p = 20, i = 100이 출력됩니다.

컴파일러의 최적화를 막아주는 타입 한정사 volatile을 이용하셔도 같은 결과를 얻을 수 있습니다.

#include <iostream>

int main() {
const volatile int num = 10;
int* p = const_cast<int*>(&num);
int i = 100;
*p = 20;

printf("&num = %x, p = %x, &i = %x\n", &num, p, &i);
printf("num = %d, *p = %d, i = %d\n", num, *p, i);


return 0;
}

+ Recent posts