c++ - constexpr 计算量的实际限制

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

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

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

最佳答案

关于此类的建议可以在 [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 .考虑到这一点,我不明白为什么实现不能使用主机的全部资源。再说一次,我不建议编写编译需要 GB 内存或其他不合理资源的程序...

关于c++ - constexpr 计算量的实际限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060007/

相关文章:

c++ - 如何使用 std::exception —— 堆栈跟踪和内存泄漏

c++ - C++ typedef 中的 struct 关键字

C++ 请有人可以解释这行代码吗?

c++ - 非 const 复制构造函数在 C++17 下编译良好

c++ - Assimp从搅拌器加载电枢导致AI_SCENE_FLAGS_INCOMPLETE

c++ - C++模板特化成员函数的定义

c++ - glm::ivec2 作为无序映射中的键

c++ - C/C++ union 中元素的内存位置

C++ 14制作自定义迭代器,它将经过2并返回修改后的数据

c++ - 为什么在访问元素之前在容器上使用 std::forward?