【发布时间】:2018-06-29 04:47:32
【问题描述】:
我有两个函数void f(int x){...} 和void g(int x){f(x);}。我知道 99% 的时间 g() 收到 3 或 5。在 f() 中,x 永远不会更改并监督大量循环和条件分支。以下会比我的原始代码更快吗?
void g(int x)
{
if(x == 3) f(3);
else if(x == 5) f(5);
else f(x);
}
编译器 (g++ -Ofast) 是否会与 f(x) 分别编译 f(3) 和 f(5),类似于编译两个模板参数?我还应该怎么做才能让编译器更容易地确认优化机会?声明void f(const int &x){...} 有用还是有必要?
【问题讨论】:
-
如果
x在f()和/或g()中没有变化,最好将其作为const传递。不确定它是否有助于提高性能,但它肯定会通知编译器x的非可变状态。 -
检查程序集,它有可能编译成完全相同的东西。如果您需要提示,请参阅
__bulitin_expect之类的内容