반응형

const

컴파일러 상수(*상수 : 정적인 data. 초기화를 한번밖에 못하는 data. 메모리 변경이 불가하다).

변수를 상수화하여, 한번 할당된 상수로 할당된 메모리의 모든 비트를 변경하지 못한다.

 

const가 붙은 변수는 선언과 초기화를 동시에 해주어야한다.

 

const int num;

int const num; 

이 두개는 같음

 

 

int a = 10;
int b = 5;

int c = 7;
int d = 9;

const int* ptr1 = &b;
int* const ptr2 = &c;

cout << "변경되기전 : ";
cout << *ptr1 << endl;
cout << ptr1 << endl;
ptr1 = &a;
cout << "변경된 후 : ";
cout << *ptr1 << endl;
cout << ptr1 << endl;

cout << "변경되기전 : ";
cout << *ptr2 << endl;
cout << ptr2 << endl;
*ptr2 = d;
cout << "변경된 후 : ";
cout << *ptr2 << endl;
cout << ptr2 << endl;

ptr1이 가리키는 값은 변경할 수 없지만

ptr1에 저장된 주소값을 바꿔주었더니 해당 주소에 저장된 값으로 변경되었다. 

(const로 상수 취급을 하지만 정말 완벽한 상수가 아니다)

 

ptr2 에 저장된 주소값을 변경할 수 없지만 

ptr2 이 가리키는 값은 변경 할 수 있다.

 

 

 

  • 가장 큰 차이는 const / constexpr 는 메모리를 할당받고, #define은 메모리를 차지하지 않는다.

 

#define 메모리에 할당되지 않음 , type을 기록하지 않음

constexpr 할당 시기는 컴파일 타임 때 확정되어야 한다 

const 할당 시기는 컴파일 / 런타임 상관 없다.

constepxr int a = 100;

void fun(int n)
{
    constexpr int var1 = a + 4;  // a 가 컴파일 타임 때 확정되기 때문에 가능
    constexpr int var2 = n + 4;  // n 이 어떤 값인지 확저외지 않으므로 에러
    const int var3 = n + 4;  
}

constexpr은 파일 타임에 정해져야 하는 값이 정해지지 않은 채로 컴파일을 시도할 때, 좀 더 느린 동작을 하는 함수를 실행시키게 되는게 아니라 아예 컴파일 에러를 발생

 

 

전처리 단계에서 진행이 되는 #define을 디버깅해서 볼 때는, 결코 찾아볼 수 없다.

이유는 이미 컴파일을 진행할 당시 define에 정의한 변수들이 전부 define의 값으로 치환되어서 컴파일이 진행되었기에 이를 찾아볼 수 없는 것이다.

디버깅 하기 어렵기 때문에 #define을 추천하지 않는 것

 

 

메모리를 할당받은 const 값에는 계산된 7 이라는 값이 들어가지만

#define 에는 그대로 2+5 가 들어가는것을 볼 수 있음

#define TEST_VARIABLE_DEFINE 2+5
const int TEST_VARIABLE_CONST = 2+5;

using namespace std;

int main(void) {
    cout << TEST_VARIABLE_DEFINE * 6 << endl;
    cout << TEST_VARIABLE_CONST  * 6 << endl;
    return 0;
}


//
32 (2 + 5 * 6)
35 (7 * 6)

 

반응형

'프로그래밍 > C++' 카테고리의 다른 글

this 포인터, 연산자 오버로딩  (0) 2022.04.15
멤버 초기화 리스트, 이니셜라이저  (2) 2022.04.13
C++ 상속  (1) 2022.04.08
NULL / nullptr  (1) 2022.03.18
virtual, override  (0) 2022.03.16

+ Recent posts