例如,如果我有这个代码:
class SomeDataProcessor
{
public:
bool calc(const SomeData & d1, const SomeData & d2) const;
private:
//Some non-mutable, non-static member variables
}
SomeDataProcessor sdp;
SomeData data1;
SomeData data2;
someObscureFunction(sdp.calc(data1, data2),
sdp.calc(data1, data2));
让我们考虑可能等效的代码:
bool b = sdp.calc(data1, data2);
someObscureFunction(b,b);
为了使其有效,calc()
函数应该满足一些要求,例如我将属性称为 _pure_const_formula_
_pure_const_formula_
会:
- 不改变任何成员、静态或全局变量状态
- 仅调用
_pure_const_formula_
函数 - 也许还有一些我没有想到的其他条件
例如,调用随机数生成器不符合这些要求。
是否允许编译器用第二个代码替换第一个代码,即使它需要递归地挖掘被调用的函数?现代编译器能做到这一点吗?
最佳答案
GCC 有 纯
attribute (用作 __attribute__((pure))
)用于告诉编译器可以消除冗余调用的函数。它用于例如在 strlen
上。
我不知道有任何编译器会自动执行此操作,尤其是考虑到要调用的函数可能无法以源代码形式提供,并且目标文件格式不包含有关函数是否为纯函数的元数据。
关于c++ - 现代 C++ 编译器是否能够避免在某些情况下两次调用 const 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227535/