검색결과 리스트
constexpr에 해당되는 글 1건
- 2012.09.12 [C++11] constexpr (3)
constexpr는 변수, 함수, 클래스를 컴파일 타임에 정수로 사용할 수 있도록 해줍니다. 즉 상수로 취급할 수 있는 작업은 컴파일 타임에 처리하도록 할 수 있습니다.
constexpr를 변수에 사용
이것은
와 같은 의미를 가집니다.
그러나 아래와 같이는 사용할 수 없습니다.
int input_num = 0;
constexpr int aa = input_num; // 에러
constexpr를 함수에 사용
C++03에서는 아래의 코드는 에러가 됩니다.
int GetNum() { retun 5; }
int Numbers[ GetNum() ];
GetNum 함수는 상수 5를 반환 하는 것으로 이미 컴파일 시에 반환 값을 알 수 있습니다. 그러나 컴파일러는 GetNum 이라는 함수가 정수처럼 사용할 수 있는지 알 수 없으므로 정수로 취급하지 않습니다.
위 코드는 C++11의 constexpr를 사용하면 우리가 원하는 대로 GetNum 함수를 정수로 사용할 수 있습니다.
constexpr int GetNum() { retun 5; }
int Numbers[ GetNum() ];
constexpr를 함수에 사용할 때는 꼭 함수 본체는 { return expression; } 형태가 되어야만 합니다.
constexpr 변수는 비 constexpr 변수에 사용할 수 있으므로 아래와 같은 테크닉도 사용할 수 있다.
constexpr double power( double x, unsigned int y )
{
return y == 1 ? x : x * power( x, y - 1 ) ;
}
int main()
{
// 정수 식
constexpr double a = power( 2, 32 ) ;
// 정수 식이 아니다
double x = 2 ; unsigned int y = 32 ;
double b = power( x, y ) ;
}
(출처) http://cpplover.blogspot.com/2010/11/gccniconstexpr.html
그리고
const int base_HP = 200;
…
int NPC_Lv1_HP = base_HP + 0;
int NPC_Lv2_HP = base_HP + 200;
라는 코드는 정수 계산을 하는데 실행 시에 계산되는데 이것을 constexpr을 사용하여 컴파일 시에 계산되게 할 수 있습니다.
constexpr int AssignHP( int nPlusHP )
{
return base_HP + nPlusHP;
}
int NPC_Lv1_HP = AssignHP( 0 );
int NPC_Lv2_HP = AssignHP( 200 );
constexpr를 클래스에 사용
constexpr을 클래스에서 사용하면 클래스를 정수로 사용할 수도 있으며 메타 템플릿 프로그래밍에서는 이전에는 복잡하게 처리하던 것을 아주 간단하게 처리할 수도 있습니다. C++ 메타 템플릿 프로그래밍에 관심이 많구나 자주 사용하고 있는 분들에게는 constexpr 덕분에 프로그래밍이 한결 편해지리라 생각합니다.
아래의 코드는 Integer 이라는 클래스를 constexpr을 사용하여 정수처럼 사용 합니다.
class Integer
{
private :
int value ;
public :
constexpr Integer() : value() { }
constexpr Integer( int value ) : value(value) { }
constexpr operator int() { return value ; }
} ;
int main()
{
constexpr Integer size = 5 ; // 컴파일 타임에 정수로
int x[size] ; // Integer::operator int()가 호출된다
Integer object ; // 일반적인 클래스 인스턴스 화. 실행 시에 처리
int y[object] ; // 당근 에러
}
출처 : http://cpplover.blogspot.com/2010/11/gccniconstexpr.html
또 메타 템플릿 프로그래밍에서는 아래와 같이 사용할 수도 있습니다.
#include <iostream>
struct pi {
static constexpr double value = 3.14;
};
template <const double& r>
struct circle_area {
static constexpr double value = r * r * pi::value;
};
struct radius {
static constexpr double value = 2.5;
};
int main()
{
constexpr double result = circle_area<radius::value>::value;
static_assert(result == 19.625, "not equal");
std::cout << result << std::endl;
}
출처 : http://d.hatena.ne.jp/faith_and_brave/searchdiary?word=constexpr&.submit=%B8%A1%BA%F7&type=detail
constexpr은 컴파일 할 때 결과가 이미 결정 나는 것은 컴파일 타임 때 처리를 해주어 실행 시에 불필요한 처리를 막아주고, 기존의 메타 템플릿 프로그래밍으로 까다롭게 만들었던 것을 아주 쉽게 구현할 수 있게 해줍니다.
C++11에서는 constexpr을 잘 사용하면 기존 보다 더 뛰어난 프로그래밍을 할 수 있으니 깊게 파고들 가치가 있다고 생각합니다.
댓글
요번에 소개해주신 constexpr은 정말 유용한 기능인것 같습니다.
C++11은 소개글을 볼때마다 깜짝 놀라는 부분들이 많은것 같습니다.
정말 놀랍고 좋은 변화들인데 실무에서도 자연스럽게 적용하려면 시간이 많이 걸릴것 같아 걱정이 되네요..^^;;;
아참, 항상 좋은 정보들 올려주셔서 감사합니다.
C++11이 아직 다 구현하지는 못해서 천천히 따라오시면 될 것 같습니다. 저도 하나씩 공부 중입니다^^
감사합니다. 정말 좋은 정보네요. std::shared_ptr 내부 구현을 보다가 constexpr 키워드가 있어서 찾아보게 되었네요. 기존 코드에 적용할 부분이 있는지 살펴봐야 겠어요 ㅎㅎ!!