作为一个实验,我只是编写了一些代码,以便在编译时生成std::array<uint32_t, 256>
。表内容本身是一个相当典型的CRC查找表 - 关于唯一的新事物是使用constexpr
函数来计算条目,而不是将自动生成的魔术表直接放在源代码中。
无论如何,这个练习让我很好奇:编译器在编译时评估constexpr
函数或变量定义时愿意做的计算量会有任何实际限制吗?例如类似于gcc的-ftemplate-depth
参数,可以对模板元编程评估的数量创建实际限制。 (我也想知道参数包的长度是否存在实际限制 - 这将限制使用std::array
中间对象创建的编译时std::integer_sequence
的大小。)
答案 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。考虑到这一点,我不明白为什么实现不能使用主机的整个资源。然后,我不建议编写编译需要千兆字节内存或其他不合理资源的程序......