const 키워드 컴파일러 최적화

mjdevv·2023년 11월 30일

c++

목록 보기
1/1
  • const 키워드로 변수 선언시 컴파일러 최적화로 해당 변수의 값을 레지스터 위로 옮겨놓음
  • 런타임에서 해당 변수값이 필요할 때 레지스터에 올려 놓은 값을 참조
  • 따라서 아래 코드에서 포인터 역참조로 값을 바꿔도 300을 출력하게 됨.

volatile 키워드를 쓸 경우, 메모리에 올라와 있는 값을 직접 참조하도록 해서 500이 출력된다.


#include <iostream> 

using namespace std;

int main(){
	
    //컴파일러가 최적화
    const int cint = 300;
    //volatile const int cint = 300;

    cout << cint << endl;
    cout << &cint << endl;
    //문법적으로 cint 값을 바꿀 수 없음(=컴파일 단계에서 막아둠). 포인터로는 강제로 접근해서 값을 바꿀 수 있다. 
    
    int* ptr = (int*) &cint; 

    *ptr = 500;
    cout << ptr << endl;
    cout << cint << endl;


}   

disassembly 코드


00007FF60FCE1944  mov         edx,12Ch  
00007FF60FCE1949  mov         rcx,qword ptr [__imp_std::cout (07FF60FCF0178h)]  
00007FF60FCE1950  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF60FCF0158h)]  
00007FF60FCE1956  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF60FCE1037h)]  

00007FF60FCE1944 mov edx, 12Ch
해당 라인에서 edx general purpose register 로 값을 옮겨 놓음.

profile
방구석 언어기술자

0개의 댓글