内联与constexpr?

Rét*_*roX 28 c++ optimization inline constexpr c++11

使用新的C++ 11标准,何时应该在inline关键字上使用constexpr关键字?constexpr关键字是否提供任何额外的优化inline,或仅仅断言必须在编译时计算事物?

为什么constexpr在调用不稳定的某些情况下在GCC 上工作,例如调用foo(x)constexpr变量?这是GCC中的错误还是它实际上是标准的一部分?

jal*_*alf 35

断言可以在编译时计算某些东西一种非常强大的优化.

内联仅通过将函数体复制/粘贴到调用站点中来移除函数调用.函数体仍然必须执行,您只需节省函数调用的开销.

但是如果你在编译时对相同的代码进行评估,它在运行时是免费的.

但既不是inline也不constexpr主要关于优化.inline主要目的是抑制单定义规则,以便可以在头文件中定义函数(这对模板很有用,顺便提一下,也可以简化内联优化)

而且constexpr是有,因为它是在元编程有用的,顺便说一下,它可以帮助编译器更好地优化代码,通过移动更多的计算编译时.

  • 根据[this question](http://stackoverflow.com/q/7065200/636019),当`constexpr`函数未在需要常量表达式的上下文中使用时,编译器没有义务在编译时计算表达式 - 时间. (5认同)
  • @jalf 我不同意“内联”主要不是关于优化。头文件中定义的 IIRC 函数默认为内联,尽管内联总是如此 - 它只是编译器提示。只要你有头部防护装置,那么 ODR 就无关紧要了。不过愿意在这里接受教育:-) (2认同)
  • 优化进入图片的地方是,如果你标记了"内联",那么你可以在每个使用它的翻译单元中看到它的定义,而不会导致ODR违规,这使编译器更容易执行内联优化.因此,关键字本身不会启用任何新的优化,但使用它可以让您更改代码的结构,这些更改可以使编译器进行优化(尽管现代编译器可以跨翻译单元进行优化,然后使用像这样也没有必要) (2认同)

Moo*_*uck 6

引用维基百科:

C++0x将引入关键字constexpr,它允许用户保证函数或对象构造函数是编译时常量。

如果函数超短,则将其标记为内联。如果编译时需要结果,则将函数标记为 constexpr。(模板参数或数组大小)。我相信如果需要的话,一个功能可以兼而有之。

可以使用非 constexpr 参数调用常量表达式函数或构造函数。正如 constexpr 整数文字可以分配给非 constexpr 变量一样,constexpr 函数也可以使用非 constexpr 参数调用,并将结果存储在非 constexpr 变量中。仅当表达式的所有成员均为 constexpr 时,该关键字才允许编译时恒定性。

因此,GCC 在这一点上并没有错。