编译器是否会对重复的函数调用进行优化?
例如,考虑以下情况。
struct foo {
member_type m;
return_type f() const; // returns by value
};
函数定义在一个翻译单元中。
return_type foo::f() const {
/* do some computation using the value of m */
/* return by value */
}
重复的函数调用在另一个单元中
foo bar;
some_other_function_a(bar.f());
some_other_function_b(bar.f());
第二个翻译单元中的代码是否会被转换为这样?
foo bar;
const return_type _tmp_bar_f = bar.f();
some_other_function_a(_tmp_bar_f);
some_other_function_b(_tmp_bar_f);
潜在地,计算
f
可能很昂贵,但返回的类型可以非常小(考虑一下返回double
的数学函数)。编译器会这样做吗?它们何时这样做或不这样做?您可以考虑这个问题的广义版本,不仅适用于成员函数或没有参数的函数。根据@BaummitAugen的建议进行澄清:
我更关心此问题的理论方面,而不是是否可以依靠这一点使现实世界中的代码运行更快。我特别感兴趣的是Linux上的x86_64的GCC。