我编写了一个与std::vector
非常相似的容器类。它有一个size()
成员函数,我声明了noexcept
、const
和constexpr
。
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++非静态成员函数中该指针引用的成员对象
因此,成员函数似乎可以是纯的,只要它们不修改成员变量。如果它们依赖于成员变量,那么如果这些成员发生更改,编译器将负责调用该方法。