【发布时间】:2017-06-26 20:35:54
【问题描述】:
编译器(通常或特别)是否优化重复的函数调用?
例如,考虑这种情况。
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 特别感兴趣。
【问题讨论】:
-
试试看...
-
诚实的建议:只要衡量它是否有所作为。如果您无法衡量差异,则差异不显着。
-
@M.M 好吧,那只会测试我能想到的几个特定场景。另外,我不太懂汇编。
-
否,除非函数以非标准方式定义为纯(没有副作用)。
-
@SU3 好的,点赞并加星标。我现在无法调查,但如果明天之前没有好的答案,我会调查一下。