Fli*_*lip 0 c++ constexpr armclang
我想用结构名称的哈希值初始化结构成员。
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;
}
Run Code Online (Sandbox Code Playgroud)
当我有:
constexpr My_Struct my_constexpr_struct;
Run Code Online (Sandbox Code Playgroud)
然后,在编译时成功计算了哈希。但是,当我有主要职能时
My_Struct my_normal_struct;
Run Code Online (Sandbox Code Playgroud)
然后它将调用
constexpr uint32_t myHash(const char* const data)
Run Code Online (Sandbox Code Playgroud)
而不是简单地使用编译时间常数初始化struct成员。
显然,这将导致可避免的重大性能损失。
关于如何在编译时执行编译器的任何想法或建议?我真的不想做:
constexpr uint32_t MY_STRUCT_ID = myHash("My_Struct");
struct My_Struct{
constexpr Test() : ID(MY_STRUCT_ID)
{
}
const uint32_t ID;
Run Code Online (Sandbox Code Playgroud)
谢谢。
constexpr是要求,而不是要求。因此,即使您通过常量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;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |