gpt4 book ai didi

c++ - 现代 C++ 编译器是否能够避免在某些情况下两次调用 const 函数?

转载 作者:IT老高 更新时间:2023-10-28 12:31:49 25 4
gpt4 key购买 nike

例如,如果我有这个代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com