constexpr vs const:将使用constexpr而不是const更好地帮助编译以优化



使用 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编译时评估(如模板参数计算)也处于活动状态。

最新更新