GNU const/pure 属性与 constexpr

lhk*_*lhk 6 c c++ gcc purely-functional constexpr

GNU C 和 C++ 提供constpure函数属性。\n来自gnu 在线文档(重点是我的):

\n

在 GNU C 和 C++ 中,您可以使用函数属性来指定某些函数属性,这些属性可以帮助编译器优化调用或更仔细地检查代码的正确性。例如,您可以使用属性来指定函数从不返回 (noreturn)、仅根据其参数的值返回值 (const)或具有 printf 样式参数 (format)。

\n

其中 const 属性似乎是 pure 的子集,也取自gnu 文档

\n
\n

const 属性比类似的 pure 属性对函数\xe2\x80\x99s\n定义施加了更大的限制。诊断同时使用 const 和 pure 属性声明相同\n函数。

\n
\n

在 C++ 11 中,添加了constexpr说明符。

\n

当应用于函数时,const 属性和 constexpr 说明符之间有区别吗?GCC 是否应用了不同的优化?

\n

一个听起来类似的问题是“constexpr”和“const”之间的差异。但我认为这不是重复的。我的问题具体是关于 function 属性const,它似乎与constexpr.

\n

eer*_*ika 4

当应用于函数时,const 属性和 constexpr 说明符之间有区别吗?

存在差异。

首先,C 没有 constexpr,因此您无法在该语言中利用它。

对 constexpr 函数的调用可以是常量表达式。因此,它们的结果可以用作数组的大小。GNU 属性不能用于实现相同的目的(忽略 GCC VLA 语言扩展)。

Constexpr 函数非常适合在编译时利用预计算。GNU 属性对于允许编译器利用运行时常量性仍然很有用。例如,假设有一个函数不能是 constexpr - 可能是因为它调用了非 constexpr 函数。但我们可能知道该函数的每次调用都会产生相同的输出,并且没有副作用。Const属性允许编译器不重复冗余调用。

另一个区别是 constexpr 函数必须内联定义。非 constexpr 函数不需要内联定义。