constexpr计算量的实际限制
Practical limitations on amount of constexpr computation
作为一个实验,我只是把一些代码放在一起,在编译时生成一个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内存或其他不合理资源的程序。
相关文章:
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- 编译器如何知道C++constexpr计算不会触发未定义的行为
- 丢弃分支中的嵌套 constexpr-if 语句仍在计算?
- 如何让编译器忽略这个计算结果为 false 的 if-constexpr?
- C++ constexpr:在编译时计算标准数组
- Clang 在编译时不会计算非 constexpr 变量的 constexpr 函数的值
- C++:当与 std::cout 一起使用时,constexpr 函数在编译时不会计算
- 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时计算
- CONSTEXPR计算的编译时间性能
- 设置具有非constexpr函数的constexpr变量(但可以在编译时间计算)
- 在C++11标准中,它在哪里指定了在翻译过程中何时可以计算constexpr函数
- 扩展编译器以在编译时计算"complicated"函数(具有已知的输入值),超出"constexpr"的范围
- 当在计算constexpr时抛出异常时会发生什么
- constexpr 函数在编译时不计算值
- 为什么 clang 不使用斐波那契的 constexpr 版本计算斐波那契(500)
- 仅在 constexpr 函数主体中的未计算上下文中使用的参数
- 将constexpr(用于在编译时计算常量)替换为模板
- 是基于constexpr的计算图灵完备
- 在编译时计算C字符串的长度.这真的是constexpr吗
- 在非类型模板参数中计算constexpr lambda