使用 constexpr 而不是 const 会更好地帮助编译优化吗?我有一些不变的值。我可以使用enum
而不是,但它们并不都是同一类型,出于卵形原因我不想使用 #define
s。它们的声明如下代码。我的问题是:如果我使用constexpr
是否会增加编译器替换文字常量值使用的值的可能性,或者如果我使用const
它没有区别?我知道这取决于每个编译器是否进行优化,但非常欢迎大多数编译器中的"一般"答案。此外,假设结果对于像这样的简单当地人来说是不同的,那么如果他们不是struct/class
的成员,那也会有所不同?在这种情况下,常量折叠最难执行吗?
例如,
int foo()
{
constexpr int x = 10;
constexpr int y = x * 3;
do_domsething(y + n);
}
对
int foo()
{
const int x = 10;
const int y = x * 3;
do_domsething(y + n);
}
今天,constexpr
仍然是相当新的,可能会遇到一些优化裂缝。 当然,变量自身值的计算需要在编译时执行。 从长远来看,我希望每个人都有相同的优化机会。 显然,发生这种情况是特定于编译器的。
只需使用对您和其他任何处理代码的人有更明确含义的任何一个,不仅在行为方面,而且在意图方面。
除此之外,请注意,constexpr
保证常量始终具有相同的值,而const
允许每次达到初始化时具有不同的值(当然,除非通过初始化,否则不能更改)。 但是,地球上几乎每个编译器都会确定,对于您的示例,值确实是恒定的。
还有一件事:即使禁用了优化,constexpr
编译时评估(如模板参数计算)也处于活动状态。