只需在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分支问题。
答案 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
构造通常成为跳转表,虽然与函数指针数组不同,它们是函数内的间接分支,而不是间接调用新函数。