【发布时间】:2020-04-19 15:01:23
【问题描述】:
我可以看到 constexpr 正在赢得越来越多的领域,而使用它而不是模板元编程 (TMP) 的论据之一是性能。我的问题是:
有没有这方面的性能比较示例?
如果 TMP 更好,为什么不将 TMP 替换为 constexpr?
TMP 保证它在编译时运行,但也可以使用 constexpr 来完成。 constexpr 处理浮点数,而 TMP 不处理,对于我见过的所有示例,替换 TMP 的 constexpr 函数更容易阅读和使用更少的代码行。 constexpr 也允许条件和循环,而 TMP 只处理循环的递归“模拟”。
我之前在这里 (link) 询问过一个相关问题 - 我有 3 种不同的元编程方式 - 这里首选 constexpr 函数方式..
【问题讨论】:
-
第三种选择的建议: 3. 为什么不根据情况混合使用 TMP 和 constexpr?
-
@max66 这不是我在我的一个示例中所做的吗?我仍然认为,与 TMP 或与 constexpr 混合的 TMP 相比,constexpr 函数仍然更可取。
-
@badaboomskey:“如果 TMP 更好,为什么不用 constexpr 替换它呢?” C++ 委员会正在努力做到这一点。但是
constexpr编码目前还没有 TMP 的能力。 -
@badaboomskey:像阶乘计算这样的例子只是玩具。 TMP 的存在主要是为了进行类型计算。 TMP 允许
tuple_element_t从tuple类型中提取其中一种类型。纯constexpr代码做不到;您可以构建一个constexpr接口来键入计算,但工作的核心将被用于某种形式的 TMP。 -
constexpr优势主要是代码可读性和在某些情况下减少编译器开销(例如,典型的编译时间阶乘可能比递归模板花费更少的时间来编译)。等效代码应该具有相似的性能,除非您遇到严重的性能问题,否则您应该使用使代码更易于阅读的任何内容。
标签: c++ metaprogramming template-meta-programming constexpr compile-time