我有一些非平凡的 C++17 函数标记为constexpr
. 他们正在做与图相关的计算(深度优先遍历)和通用算法(例如,查找、排序、唯一...)。
如果我尝试通过将结果放入constexpr
全局变量来强制在编译时进行评估,则可能会发生 3 件事:
- 对于小型计算(给出一个想法,可以说是约 100 个节点的图,节点或多或少是整数)编译很好(大约需要 2 秒)
- 使用约 500 个节点,编译需要约 1 分钟并占用 30GB 内存(!)。
- 对于大约 1000 个节点,编译需要太多内存才能完成。
如果我删除constexpr
限定符并要求运行时计算,编译和执行速度非常快(不到 5 秒)
我将 g++ 8.2 与 -O3 -std=c++17 一起使用。
为什么要花这么长时间?g++ 是否以编译时优化问题而闻名constexpr
?constexpr
在编译期间我应该期望函数的性能如何?据我了解,编译器将自己变成了constexpr
计算的解释器。但我绝对不怀疑,在 Python 中评估相同的程序会非常快,因为数据量非常小。
编辑:这里提到了这些问题(GCC 开发人员的博客)