constexpr计算量的实际限制

Dan*_*ler 5 c++ limits constexpr c++11 c++14

作为一个实验,我只是将一些代码放在一起,以便std::array<uint32_t, 256>在编译时生成.表内容本身是一个相当典型的CRC查找表 - 关于唯一新的事情是使用constexpr函数来计算条目而不是将自动生成的魔术表直接放在源代码中.

无论如何,这个练习让我很好奇:编译器constexpr在编译时评估函数或变量定义的计算量是否会有任何实际限制?例如,像gcc的-ftemplate-depth参数一样,对模板元编程评估的数量创建实际限制.(我也想知道参数包的长度是否存在实际限制 - 这将限制std::array使用std::integer_sequence中间对象创建的编译时的大小.)

Col*_*mbo 4

对此的建议可以在[implimits] \xc2\xb62中找到:

\n
\n

(2.35) \xc2\xa0 \xe2\x80\x94 \xe2\x80\x82 递归 constexpr 函数调用 [ 512 ]

\n

(2.36) \xc2\xa0 \xe2\x80\x94 \xe2\x80\x82 在核心常量表达式中计算的完整表达式 [ 1 048 576 ]

\n
\n

GCC 和 Clang 允许通过-fconstexpr-depth(这是您正在寻找的标志)进行调整。

\n

常量表达式求值实际上在沙箱中运行,因为未定义的行为必须被实现抢占。考虑到这一点,我不明白为什么该实现不能使用主机的全部资源。再说一次,我不建议编写编译需要千兆字节内存或其他不合理资源的程序......

\n