constexpr计算量的实际限制

时间:2016-06-27 17:38:31

标签: c++ c++11 c++14 constexpr limits

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

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

1 个答案:

答案 0 :(得分:3)

有关此类建议可在[implimits] ¶2

中找到
  

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

     

(2.36) - 在核心常数表达式[ 1 048 576 ]

中评估的完整表达式

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

常量表达式评估实际上在沙箱中运行,因为undefined behavior must be preempted by the implementation。考虑到这一点,我不明白为什么实现不能使用主机的整个资源。然后,我不建议编写编译需要千兆字节内存或其他不合理资源的程序......