使用从不打算在常量表达式中使用的constexpr变量是否有好处?

问题描述 投票:1回答:2

这是this one.的后续问题

从链接问题中的一个答案中可以看出,将变量声明为constexpr的目的并不是真正告知编译器将该变量用作常量表达式的可能性(尽管这是编译器的最终行为) )而是向其他程序员传达变量可用于常量表达式的意图。我的问题是,如果变量不打算用在常量表达式中,则将变量声明为constexpr是否有任何好处,性能或其他方面(例如,类的常量成员变量仅出现在非常量表达式中其他非const成员变量)。还假设这不适用于嵌入式系统。

我使用代码,其中以前的开发人员似乎使用constexpr喜欢它的糖果,即使它不清楚意图是在常量表达式中使用变量(如前一段中的示例)。我想知道他们是否知道我不知道的事情。

c++ constexpr
2个回答
1
投票

而是向其他程序员传达变量可用于常量表达式的意图。

这是一个意见问题但我不同意。

原则上,我认为最好在编译时将所有可以知道和计算的东西都变成constexpr。它也可以用于常量表达式这一事实是一个附带的好处。使用constexpr也可能具有与性能相关的好处。

我想要做的关键点是“在编译时知道值”是变量/数据的一个特征。最好通过使用语言提供的功能捕获该特征。如果有任何不良副作用,那么唯一可以证明不使用它的理由。


0
投票

是的,constexpr变量不仅仅用于传达意图和在其他常量表达式中使用。

如果您标记变量constexpr,编译器将强制它本身使用常量表达式初始化。您可以使用它来确保您希望在编译时评估的内容实际上是。例如:

constexpr int constexpr_function() { return 123; }
int expensive_runtime_function() { return 123; }

void f()
{
    constexpr int good1 = constexpr_function(); // OK.
    // constexpr int good2 = expensive_runtime_function(); // Good: error.

    const int bad1 = constexpr_function(); // OK.
    const int bad2 = expensive_runtime_function(); // Bad: unexpected runtime cost.
}
© www.soinside.com 2019 - 2024. All rights reserved.