2016-06-27 50 views
5

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

无论如何,这个练习让我很好奇:在编译时,编译器愿意做什么来计算一个constexpr函数或变量的定义会有什么实际的限制吗?例如像海湾合作委员会的-ftemplate-depth参数创建模板元编程评估量的实际限制。 (I也不知道是否有可能在一个参数包的长度实际限制 - 这将限制的使用std::integer_sequence中间对象创建一个编译时std::array大小。)

+0

如果我记得正确,是的是有一个限制,但它应该是比递归更大的数量级实例化限制。 – MikeMB

回答

3

这种建议可以在[implimits] ¶2找到:

(2.35)   —   Recursive constexpr function invocations [512]

(2.36)   —   Full-expressions evaluated within a core constant expression [1 048 576]

GCC和Clang的允许通过-fconstexpr-depth调整(这是你要找的标志)。

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

+0

好吧,“模板声明中的模板参数[1024]”是否也会计算参数包的长度? (我猜是的,否则你只能遇到写入极其糟糕的C++代码的限制)。如果是这样,那意味着构建一个'std :: array '查找表来处理两个字节在一段时间可能不实际。 –

+0

@DanielSchepler我不明白。 – Columbo

+0

最后,表格由一个函数'template constexpr std :: array crc_table_impl(uint32_t crc_poly,std :: integer_sequence