用分支启动函数

Hum*_*awi 5 c++ branch-prediction

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

第一:

void think_and_do(){
    if(expression){
        //Set_A of instructions
    }
    else{
         //Set_B of instructions
    }
}

int main(){
    think_and_do();
}
Run Code Online (Sandbox Code Playgroud)

第二:

void do_A(){
    //Set_A of instructions
}

void do_B(){
    //Set_B of instructions
}

int main(){
    if(expression){
        do_A();
    }
    else{
        do_B();
    }
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*urt 3

我已经在 godbolt.org think_and_domain中进行了测试

首先观察,如果你的例子很琐碎,它们大部分都会被优化掉。如果没有这cin两个示例应该编译为:

    xor     eax, eax
    add     rsp, 8 #may or may not be present.
    ret 
Run Code Online (Sandbox Code Playgroud)

第二个观察结果是 main 中的代码完全相同:并且没有调用任何函数,所有内容都是内联的。

第三个观察结果是两个示例都生成了以下代码

    mov     edx, DWORD PTR a[rip]
    mov     eax, DWORD PTR b[rip]
    cmp     edx, eax
    je      .L8
Run Code Online (Sandbox Code Playgroud)

也就是说,它们填充 4 条指令的一个周期,以充分利用发出的指令(并忽略 cmp 和跳转的宏融合的可能性)。

如果他们一开始就

    cmp     edx, eax
    je      .L8
Run Code Online (Sandbox Code Playgroud)

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