2017-04-06 4 views
0

struct 이름을 해시하는 구조체 멤버를 초기화하고 싶습니다.constexpr 생성자 초기화 자 목록에있는 Constexpr 함수

constexpr uint32_t myHash(const char* const data) 
{ //Some code for hash 
    return myHash; 
} 

struct My_Struct{ 
    constexpr Test() : ID(myHash("My_Struct")) 
    { 
    } 
    const uint32_t ID; 
} 

내가 가지고있는 경우 :

constexpr My_Struct my_constexpr_struct; 

그런 다음 해시가 성공적으로 컴파일 타임에 계산됩니다. 내 주요 기능에있을 때,

My_Struct my_normal_struct; 

는 단순히 컴파일 시간 상수와 구조체 멤버를 초기화하는 대신 코드에서

constexpr uint32_t myHash(const char* const data) 

함수를 호출합니다.

이렇게하면 피할 수없는 상당한 성능 저하가 발생할 수 있습니다.

컴파일러에서 컴파일시 수행 방법에 대한 의견이나 제안이 있으십니까? 나는 정말로하고 싶지 않다 :

constexpr uint32_t MY_STRUCT_ID = myHash("My_Struct"); 
struct My_Struct{ 
    constexpr Test() : ID(MY_STRUCT_ID) 
    { 
    } 
    const uint32_t ID; 

고마워.

답변

2

constexpr은 요청 사항이며 필수 사항은 아닙니다. 따라서 constexpr 생성자를 통해서도 상수 표현식 컨텍스트 외부에서 개체를 초기화하면 초기화시 컴파일이 수행된다는 보장이 없습니다.

컴파일 타임 평가를 보장하려는 경우 은 이라고하는을 상수 표현 컨텍스트로 호출해야합니다. 변수의 명시 적 사용은 어떤 식 으로든 당신을 불쾌하게 하셨나요, 당신은 항상 템플릿의 사용을 통해 constexpr 평가를 강제 수 :

template<typename T, T t> 
struct repeat 
{ 
    using value_type = T; 
    static constexpr T value = t; 
    constexpr T operator()() const noexcept {return t;} 
}; 

struct My_Struct{ 
    constexpr My_Struct() : ID(repeat<uint32_t, myHash("My_Struct")>::value) 
    { 
    } 
    const uint32_t ID; 
}; 
+0

감사합니다,이 (또는이 일부 변화) 일 수있다. – Flip

관련 문제