【发布时间】:2017-09-08 23:52:15
【问题描述】:
有没有办法将下面的 C 代码转换为不带任何条件语句的东西?我已经分析了我的一些代码,并注意到它在与此非常相似的 if 语句上出现了许多分支未命中。
int cond = /*...*/;
int a = /*...*/;
int b = /*...*/;
int x;
if (cond) {
x = a;
} else {
x = b;
}
【问题讨论】:
-
你在这个片段后面使用
a和b吗?我假设你在这之后也使用x。 -
@JonathanLeffler:不,我不在这个片段之后使用 a 和 b。
-
如果你在这个片段后面不使用
a或b,那么你不需要同时计算这两个,除非它们的计算有副作用。 -
可能编译器认为最好避免计算不需要的
a和b,即使以分支预测错误为代价。谁知道呢?也许是对的。 -
以上假设您告诉编译器要编译哪个架构,该架构具有条件移动操作码,并且您已请求优化。如果所有这些都是真的,编译器应该发出条件移动指令,除非它有充分的理由不这样做。
标签: c branch-prediction