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
是有,因为它是在元编程有用的,顺便说一下,它可以帮助编译器更好地优化代码,通过移动更多的计算编译时.
引用维基百科:
C++0x将引入关键字constexpr,它允许用户保证函数或对象构造函数是编译时常量。
如果函数超短,则将其标记为内联。如果编译时需要结果,则将函数标记为 constexpr。(模板参数或数组大小)。我相信如果需要的话,一个功能可以兼而有之。
可以使用非 constexpr 参数调用常量表达式函数或构造函数。正如 constexpr 整数文字可以分配给非 constexpr 变量一样,constexpr 函数也可以使用非 constexpr 参数调用,并将结果存储在非 constexpr 变量中。仅当表达式的所有成员均为 constexpr 时,该关键字才允许编译时恒定性。
因此,GCC 在这一点上并没有错。