GCC 12 建议添加 "pure" 属性



我编写了一个与std::vector非常相似的容器类。它有一个size()成员函数,我声明了noexceptconstconstexpr

class my_vector {
...
constexpr auto size() const noexcept -> size_type {
assert(stride_ != 0);
return nelems_/stride_;
}
};

由于我切换到了GCC 12,编译器建议我添加__attribute__ ((pure))

error: function might be candidate for attribute 'pure' if it is known to return normally [-Werror=suggest-attribute=pure]

我很乐意添加属性,但首先,函数真的是pure吗?我的意思是,this是通过引用传递的,我认为引用的函数不可能是";纯";因为它们的参数可以在函数外部更改(例如由另一个线程更改(。是这样吗?

编译器遵循此建议通常安全吗?

最后,我不明白这些建议的逻辑:如果编译器能够确定函数是纯函数,那么它应该继续进行并尽其所能进行所有优化,而不是建议添加非标准的语言扩展。

根据gcc文档

即使hash采用了一个非常量指针参数,它也不能修改它所指向的数组,或者程序其他部分可能依赖的任何其他对象的值。但是,调用者可以在连续调用函数之间安全地更改数组的内容(这样做会禁用优化(。该限制也适用于C++非静态成员函数中该指针引用的成员对象

因此,成员函数似乎可以是纯的,只要它们不修改成员变量。如果它们依赖于成员变量,那么如果这些成员发生更改,编译器将负责调用该方法。

相关内容

  • 没有找到相关文章

最新更新