我有一个constexpr函数,该函数根据字符串文字计算CRC32哈希值。

template <size_t len>
constexpr uint32_t ctcrc32(const char (&str)[len]) {
    return detail::crc32<len - 2>(str) ^ 0xFFFFFFFF;
}

(它指的是其他constexpr函数)

我想做的是调用其他一些接受uint32_t值的函数,并使用它来访问unordered_map中的数据。这样的调用看起来像这样:
uniformByNameCRC32(ctcrc32("uPointLight.position"));

我希望"uPointLight.position"的哈希在构建时计算一次,然后将结果常量传递给uniformByNameCRC32(),但事实并非如此,由于我有很多ctcrc32()调用,因此uniformByNameCRC32()在运行时被调用,这基本上会杀死CPU。

但是,这很好用:
std::array<uint64_t, ctcrc32("string_literal")> array;

这样的代码编译并指示ctcrc32()的返回值确实是constexpr

我在这里想念什么?

最佳答案

使用中间的constrexpr变量:

constexpr auto value = ctcrc32("uPointLight.position")
uniformByNameCRC32(value);

09-25 18:52