我一直在读一本关于 C++14/11 的书。我刚刚读完关于
constexpr
关键字的章节。我知道它的用途,但我应该多久使用一次constexpr
?我是否应该在我知道永远不会用于创建 contstexpr
对象的类的代码中使用它? (以防万一,因为它不需要我花任何钱,对吧?)
C++14 我应该多久使用一次 constexpr?
在 Scott Meyer 书 Effective Modern C++ 的第 15 项(尽可能使用 constexpr)中有广泛的讨论。
本项目的概述是,应尽可能使用
constexpr
,因为 constexpr
函数和对象比非 constexpr
函数和对象可以在更广泛的上下文中使用。
然而,在同一篇文章中,作者提到了过度使用
constexpr
的警告。也就是说,如果您决定将某个对象或函数限定为 constexpr
,您的客户将被允许在 constexpr
内容中使用它。但是,如果您后来决定此代码不能是 constexpr
并删除 constexpr
,这可能会导致您的代码无法编译,包括这会给您的客户带来的副作用。
引用原文:
“尽可能使用 constexpr”是指您愿意对其施加于对象和对象的约束做出长期承诺 您将其应用到的功能。
使用 constexpr 指定真正的常量以及支持其定义的函数。 consteval 可用于不得在运行时调用的代码。避免复杂化函数定义以使其能够与 constexpr 一起使用。不要使用 constexpr 或 consteval 强制内联。
需要注意的是,如果没有
static
关键字,在局部变量上使用 constexpr
可能会导致大型数组出现一些性能问题。它们可能在运行时初始化,而不是将它们作为数据存储在可执行文件中。 constexpr
并不暗示
static
,只是
const
。一份名为
Don’t constexpr All The Things 的白皮书提到了更多缺点,包括将函数标记为 constexpr
所需的复杂规则集。一种务实的方法可能是将
constexpr
关键字的使用限制为仅编译时间函数和支持这些函数的变量声明。将编译时函数中未使用的变量标记为
constexpr
而不是
const
的用处有限,除非可以证明编译器将输出更好的汇编语言。