C++ 分支预测与分支目标预测
我是否正确理解了这一点,C++ 分支预测与分支目标预测,c++,performance,polymorphism,cpu,branch-prediction,C++,Performance,Polymorphism,Cpu,Branch Prediction,我是否正确理解了这一点,如果语句更依赖于分支预测,而v表查找更依赖于分支目标预测?关于v表,没有“分支预测”,只有目标预测 试图了解CPU如何处理v表。分支预测是预测是否执行分支。分支目标预测是预测分支将要到达的位置。这两件事是独立的,可以在所有的组合中发生 例如: 无条件分支,固定目标 无限循环 goto语句 中断或继续语句 if/else语句的'then'子句结尾(跳过else子句) 非虚函数调用 无条件分支,可变目标 从函数返回 虚拟函数调用 函数指针调用 switch语句(如果编译
如果
语句更依赖于分支预测,而v表查找更依赖于分支目标预测?关于v表,没有“分支预测”,只有目标预测
试图了解CPU如何处理v表。分支预测是预测是否执行分支。分支目标预测是预测分支将要到达的位置。这两件事是独立的,可以在所有的组合中发生 例如: 无条件分支,固定目标
- 无限循环
语句goto
或中断
语句继续
语句的'then'子句结尾(跳过if/else
子句)else
- 非虚函数调用
- 从函数返回
- 虚拟函数调用
- 函数指针调用
语句(如果编译成跳转表)switch
语句if
语句(如果编译成一系列switch
语句)if/else
- 循环条件测试
和&&
运算符|
- 三元
运算符?:
- 在正常情况下不太可能出现,但编译器可以将其中一种情况作为优化进行综合,并结合上述两种情况。例如,在x86上,如果由于尾部调用优化而出现在函数末尾,编译器可能会将类似
的代码优化为类似if(condition){obj->VirtualFunctionCall();}
的条件间接跳转jne*%eax
if
和循环通常使用分支预测(布尔输出),而函数指针/虚拟函数使用分支目标预测(目标输出)。我如何理解关闭的原因?这不是一个宽泛的问题——有两个问题,既相关又具体?(但我感谢你花时间通过评论回答我的问题)啊!您可能没有足够的声誉来访问关闭
对话框:X看看这个:如果您转到幻灯片13,分支目标预测器在哪里?@user997112它可能是左上角块“分支预测器”的一部分,否则您将如何将目标馈送到提取单元?