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

标签 c++ optimization compiler-construction call

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

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/

相关文章:

c++ - 在 linux mint 上学习 c++(适用于 .net 开发人员)

c++ - 链接错误 VC++

java - 带有 List<String> 的原始类型给出编译错误

c++ - 使用自定义工具集获取动态 atexit 析构函数链接错误 - eh vector destructor

c++ - std::experimental::is_detected 的奇怪 MSVC 行为

c# - 优化 Bing map 地理编码和 RouteMapping 请求

c++ - 使用 gcc 在 C++ 中嵌入常量循环条件优化

java - Java可以缓存一个特定的函数吗?

c++ - 转义(\)字符背后的魔法是什么

c++ - 不是编译器优化 C++ 中的代码部分