【发布时间】:2016-06-17 08:35:59
【问题描述】:
关于 SO 上的“冗余函数调用”的编译器优化有很多问题和很好的答案(我不会发布链接),但是,我在 多个相同 函数调用上找不到任何东西就这样。
假设我有这样的代码 sn-p:
void fairlyComplexFunction(const double &angle)
{
//do stuff and call "sin(angle)" very often in here
}
调用sin(angle) 是一个相当昂贵的操作,因为angle 是fairlyComplexFunction 范围内的常量,所以每次调用正弦函数都会得到相同的结果,所以只调用它一次是更好的方法:
void fairlyComplexFunction(const double &angle)
{
const double sineOfAngle = sin(angle);
//do stuff and use sineOfAngle very often in here
}
编译器是否能够以任何方式检测到此类事情并为我优化,还是第二个示例是更好的方法?
【问题讨论】:
-
自己编译看看输出?
-
@KerrekSB 首先,我真的不擅长查看和理解汇编语言。另外,仅仅因为当我编译它并且它不起作用时,并不意味着其他编译器可能无法做到。
-
原则上,如果编译器可以确定所讨论的函数是一个纯函数(没有副作用,并且唯一影响其输出的是它的输入, ) 然后它可以轻松消除多个调用。然而,在 C++ 中证明一个函数是纯函数并不总是那么容易或微不足道的。
-
@yzt 在这种情况下,sin(x) 确实是一个纯函数,所以我猜它“原则上可以工作”?
-
@phil13131:不仅是一个纯函数,而且是实现提供的函数。这不仅仅是“原则上可行”,我实际上是期待的。我什至希望对
sin(x)和cos(x)的调用能够合并,即使它们不是相同的函数(!)
标签: c++ function optimization