const
: Type을 상수화하겠다는 키워드
constexpr
: 변수나 함수의 값이 컴파일 타임에 결정됨을 나타내는 키워드
C++98/03에서 const 의 문제점을 살펴보자.
const 의 의미는 컴파일 타임에 상수화 시키겠다는 것이다.
따라서 컴파일러가 컴파일 할 때 code에서 c가 나오면 매크로처리하듯이 10으로 치환해버린다.
따라서 일반 포인터 변수에 상수 c의 주소를 가리키게 할 수 없다.
하지만 상수 c의 주소를 강제적 형변환을 통해서 포인터 변수에 담을 수 있다.
c와 *p의 출력 결과를 살펴보면,
c의 출력 결과가 10으로 p에 의해 변경된 값이 아닌 것을 볼 수 있다.
int 변수 n을 const int 에 대입했을 때의 경우를 살펴보면,
cn은 컴파일 타임에 결정될 수 없는 runtime constant 이다.
따라서 이후 cn 을 통해서 변경이 불가능할 뿐이지,
p1 포인터가 값을 변경하는데 전혀 문제가 발생하지 않는다.
Runtime constant 는 배열에서도 문제를 발생 시킬 수 있다.
배열 크키는 컴파일 타임에 결정되어야 하는데, runtime constant 는 runtime 에 결정되므로
배열 크기로 사용될 수가 없다.
배열 크기에 대한 혼란
C89 : 배열 크기는 컴파일 시간 상수 이어야 한다.('1989)
C99 : 배열 크기로 변수를 보낼 수 있다. - gcc 지원 ('1999)
하지만, gcc 를 제외한 대부분 컴파일러는 지원하지 않음
결국, c++11에서는 컴파일 전용 상수 키워드를 만들게 된다.
constexpr 키워드를 사용함으로써 반드시 컴파일 타임에 정해진 상수를 사용하도록 강제할 수 있다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기