lhk*_*lhk 6 c c++ gcc purely-functional constexpr
GNU C 和 C++ 提供const
和pure
函数属性。\n来自gnu 在线文档(重点是我的):
在 GNU C 和 C++ 中,您可以使用函数属性来指定某些函数属性,这些属性可以帮助编译器优化调用或更仔细地检查代码的正确性。例如,您可以使用属性来指定函数从不返回 (noreturn)、仅根据其参数的值返回值 (const)或具有 printf 样式参数 (format)。
\n其中 const 属性似乎是 pure 的子集,也取自gnu 文档:
\n\n\nconst 属性比类似的 pure 属性对函数\xe2\x80\x99s\n定义施加了更大的限制。诊断同时使用 const 和 pure 属性声明相同\n函数。
\n
在 C++ 11 中,添加了constexpr
说明符。
当应用于函数时,const 属性和 constexpr 说明符之间有区别吗?GCC 是否应用了不同的优化?
\n一个听起来类似的问题是“constexpr”和“const”之间的差异。但我认为这不是重复的。我的问题具体是关于 function 属性const
,它似乎与constexpr
.
当应用于函数时,const 属性和 constexpr 说明符之间有区别吗?
存在差异。
首先,C 没有 constexpr,因此您无法在该语言中利用它。
对 constexpr 函数的调用可以是常量表达式。因此,它们的结果可以用作数组的大小。GNU 属性不能用于实现相同的目的(忽略 GCC VLA 语言扩展)。
Constexpr 函数非常适合在编译时利用预计算。GNU 属性对于允许编译器利用运行时常量性仍然很有用。例如,假设有一个函数不能是 constexpr - 可能是因为它调用了非 constexpr 函数。但我们可能知道该函数的每次调用都会产生相同的输出,并且没有副作用。Const属性允许编译器不重复冗余调用。
另一个区别是 constexpr 函数必须内联定义。非 constexpr 函数不需要内联定义。
归档时间: |
|
查看次数: |
1284 次 |
最近记录: |