IF语句ASM和CPU分支

时间:2014-02-02 17:45:12

标签: c performance assembly x86 cpu

只需在VS2012中使用解除装配窗口:

if(p == 7){
00344408  cmp         dword ptr [p],7  
0034440C  jne         main+57h (0344417h)  
    j = 2;
0034440E  mov         dword ptr [j],2  
}
else{
00344415  jmp         main+5Eh (034441Eh)  
    j = 3;
00344417  mov         dword ptr [j],3  
}

我说跳转表已经实现了吗?如果是这样,这仍然会导致CPU分支问题,因为程序集仍然必须执行cmp命令吗?

我正在研究IF语句的性能成本,并想知道编译器优化到跳转表是否意味着没有更多的CPU分支问题。

3 个答案:

答案 0 :(得分:2)

这里没有跳转表:两个跳转指令在某个绝对地址上:

jne         main+57h (0344417h) 
jmp         main+5Eh (034441Eh)

没有间接性。使用跳转表并不能解决所有“CPU分支问题”。有或没有跳转表的分支预测成本应该是相似的。

答案 1 :(得分:2)

我不会称之为跳转表。跳转表是一个目标地址数组,索引是根据您要切换的用户数据动态计算的。您展示的代码只是一个简单的控制流,带有两个备用分支,完全静态编码控制流。

作为典型示例,if (X) foo() else bar()变为(伪代码):

jump_if(!X, Label),  foo(),  jump(End),  Label: bar(),  End:

答案 2 :(得分:1)

在纯C或C ++中表达跳转表的最接近的方法是使用函数指针数组。

switch构造通常成为跳转表,虽然与函数指针数组不同,它们是函数内的间接分支,而不是间接调用新函数。