constexpr计算量的实际限制

Practical limitations on amount of constexpr computation

本文关键字:计算 constexpr      更新时间:2023-10-16

作为一个实验,我只是把一些代码放在一起,在编译时生成一个std::array<uint32_t, 256>。表内容本身是一个相当典型的CRC查找表——唯一的新东西是使用constexpr函数来计算条目,而不是直接在源代码中放置一个自动生成的魔法表。

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

可以在[impliments]中找到此类建议¶2:

(2.35) -递归constexpr函数调用[512]

(2.36) -在核心常量表达式内求值的完整表达式[1 048 576]

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

常量表达式求值实际上是在沙盒中运行的,因为未定义的行为必须被实现抢占。考虑到这一点,我不明白为什么实现不能使用主机的全部资源。不过,我也不建议编写那些编译需要gb内存或其他不合理资源的程序。