gcc 似乎对复杂的常量折叠有一些限制。这是一个例子:
static inline unsigned int DJBHash(const char *str)
{
int i;
unsigned int hash = 5381;
for(i = 0; i < strlen(str); i++)
{
hash = ((hash << 5) + hash) + str[i];
}
return hash;
}
int f(void)
{
return DJBHash("01234567890123456");
}
当以 -O3 优化级别(gcc 4.8)运行时,它会很好地展开 DJBHash 中的循环,并在编译期间计算该字符串的哈希值。
但是,当使字符串变长一个字符时return DJBHash("012345678901234567");
,它不再折叠它并生成一个带有条件跳转指令的循环。
我想将任意长度的文字字符串折叠为其哈希值作为编译时间常数。
这可以做到吗?
澄清
我的问题是关于 gcc 上的常量折叠优化(请参阅标题 - 请不要删除gcc和编译器标签)
这里的许多答案试图用模板或 constexpr 解决问题。很高兴了解这些选项,并感谢您发布它们以造福所有人。但是,他们没有直接回答我的问题。
实际上,我正在开发一个 gcc 端口,因此如果需要,我可以更改和构建 gcc 源代码。但我仅限于 C,我想在这个范围内解决这个问题。