用分支启动函数

时间:2016-10-24 12:47:42

标签: c++ branch-prediction

从优化和分支预测器的角度来看,这两个代码之间有什么区别吗?

首先

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();
    }
}

1 个答案:

答案 0 :(得分:3)

我在godbolt.org think_and_domain

进行了测试

首先观察一下,如果你的例子是微不足道的,那么它们大多数都会被优化掉。如果没有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

问题带宽的一半可能会被浪费。