我理解正确吗,if
语句更依赖于分支预测,而v表查找更依赖于分支目标预测?关于对向表,没有"分支预测",只有目标预测?
试图了解 CPU 如何处理向量表。
分支预测是预测是否将采用分支。分支目标预测是预测分支要去哪里。 这两件事是独立的,可以在所有组合中发生。
这些示例可能是:
无条件分支,固定目标
- 无限循环
goto
声明break
或continue
声明if/else
语句的"then"子句的结尾(跳过else
子句)- 非虚函数调用
无条件分支,可变目标
- 从函数返回
- 虚函数调用
- 函数指针调用
switch
语句(如果编译到跳转表中)
条件分支,固定目标
if
声明switch
语句(如果编译成一系列if/else
语句)- 回路条件测试
&&
和||
运营商- 三元
?:
运算符
条件分支,变量目标
- 在正常情况下不太可能出现,但编译器可能会合成一个作为优化,结合上述两种情况。 例如,在 x86 上,编译器可能会将代码(如
if (condition) { obj->VirtualFunctionCall(); }
)优化为条件间接跳转(如jne *%eax
),如果由于尾部调用优化而出现在函数末尾。