10

我是否理解对了,if语句更依赖于分支预测,而 v-table 查找更依赖于分支目标预测?关于v-tables,没有“分支预测”,只有目标预测?

试图了解 CPU 是如何处理 v-table 的。

4

1 回答 1

9

分支预测是预测分支是否会被采用。分支目标预测是分支要去哪里的预测。这两件事是独立的,可以在所有组合中发生。

这些例子可能是:

无条件分支,固定目标

  • 无限循环
  • goto陈述
  • breakcontinue声明
  • 语句的“then”子句结束if/else(跳过该else子句)
  • 非虚函数调用

无条件分支,可变目标

  • 从函数返回
  • 虚函数调用
  • 函数指针调用
  • switch语句(如果编译成跳转表)

条件分支,固定目标

  • if陈述
  • switch语句(如果编译成一系列if/else语句)
  • 循环条件测试
  • 和运算&&||
  • 三元?:运算符

条件分支,可变目标

  • 在正常情况下不太可能出现,但编译器可能会合成一个作为优化,结合上述两种情况。例如,在 x86 上,编译器可能会将代码优化if (condition) { obj->VirtualFunctionCall(); }为条件间接跳转,就像jne *%eax由于尾调用优化而出现在函数末尾一样。
于 2014-02-06T17:00:24.660 回答