const와 constexpr 차이점
🦥 기본 의미와 구문
두 키워드 모두 객체 선언과 함수 선언에 사용될 수 있다. 객체에 적용할 때의 기본적인 차이점은 다음과 같다.
const
declares an object as constant. This implies a guarantee that once initialized, the value of that object won’t change, and the compiler can make use of this fact for optimizations. It also helps prevent the programmer from writing code that modifies objects that were not meant to be modified after initialization.constexpr
declares an object as fit for use in what the Standard calls constant expressions. But note thatconstexpr
is not the only way to do this.
When applied to functions the basic difference is this:
const
can only be used for non-static member functions, not functions in general. It gives a guarantee that the member function does not modify any of the non-static data members (except for mutable data members, which can be modified anyway).constexpr
can be used with both member and non-member functions, as well as constructors. It declares the function fit for use in constant expressions. The compiler will only accept it if the function meets certain criteria (7.1.5/3,4), most importantly (†):- The function body must be non-virtual and extremely simple: Apart from typedefs and static asserts, only a single
return
statement is allowed. In the case of a constructor, only an initialization list, typedefs, and static assert are allowed. (= default
and= delete
are allowed, too, though.) - As of C++14, the rules are more relaxed, what is allowed since then inside a constexpr function:
asm
declaration, agoto
statement, a statement with a label other thancase
anddefault
, try-block, the definition of a variable of non-literal type, definition of a variable of static or thread storage duration, the definition of a variable for which no initialization is performed. - The arguments and the return type must be literal types (i.e., generally speaking, very simple types, typically scalars or aggregates)
- The function body must be non-virtual and extremely simple: Apart from typedefs and static asserts, only a single
상수 구문은 컴파일러가 평가(evaluate)할 수 있으며, 정수, 부동소수점 수, 열거형으로 시작하여야 하며, 연산자나, 값을 결과로 생산하는 constexpr 함수로 결합할 수 있다.상수 구문은 다음의 이유 때문에 쓰인다.상수는 코드의 가독성을 높인다. 특히, 마법의 숫자(magic number)를 피할 수 있다.상수는 유지보수를 쉽게 한다.멀티 스레드 시스템에서 개체 간 자원 경쟁을 피할 수 있다.가끔 컴파일 시간에 무언가를 평가하는 것이 성능 향상으로 이어질 수 있다.시스템 요구사항을 좀 더 직접적으로 표현할 수 있다. (e.g. 임베디드 시스템에서 불변 데이터를 읽기 전용 메모리에 넣는 경우 등) SM’s Development Log:티스토리
const
로 정의 된 상수들은 굳이 컴파일 타임에 그 값을 알 필요가 없다. 컴파일 타임에 초기화 될 수도, 런타임에 초기화될 수도 있다. 반면 constexpr
은 컴파일 타임에 초기화 된다.
Leave a comment