从优化和分支预测器的角度来看,这两个代码之间有什么区别吗?
首先
void think_and_do(){
if(expression){
//Set_A of instructions
}
else{
//Set_B of instructions
}
}
int main(){
think_and_do();
}
第二
void do_A(){
//Set_A of instructions
}
void do_B(){
//Set_B of instructions
}
int main(){
if(expression){
do_A();
}
else{
do_B();
}
}
答案 0 :(得分:3)
我在godbolt.org think_and_do和main
进行了测试首先观察一下,如果你的例子是微不足道的,那么它们大多数都会被优化掉。如果没有cin
这两个示例应编译为:
xor eax, eax
add rsp, 8 #may or may not be present.
ret
第二个观察结果是main中的代码完全相同:没有调用任何函数,所有内容都是内联的。
第三个观察是两个例子都生成以下代码
mov edx, DWORD PTR a[rip]
mov eax, DWORD PTR b[rip]
cmp edx, eax
je .L8
那就是他们填充4个指令的一个周期以充分利用发布(并忽略cmp和跳转的宏观融合的可能性)。
如果他们以
开头 cmp edx, eax
je .L8
问题带宽的一半可能会被浪费。