C++ 代码分支到底是什么

C++ 代码分支到底是什么,c++,C++,什么是代码分支?我在不同的地方看到过它,特别是有点无聊,但从来没有真正想过它 它是如何减慢程序的速度的?编码时我应该考虑什么 我看到有人提到if语句。我真的不明白这样的代码怎么会减慢代码的速度。如果条件为真,执行以下指令,否则跳转到另一组指令?我看到另一个帖子提到“分支预测”,也许这就是我真正迷路的地方。有什么可预测的?条件就在那里,它只能是真的或假的 我不相信这是一个复制品。链接的线程是指参照未排序数组的“分支预测”。我在问什么是分支以及为什么需要预测。分支最简单的例子是if语句: if (c

什么是代码分支?我在不同的地方看到过它,特别是有点无聊,但从来没有真正想过它

它是如何减慢程序的速度的?编码时我应该考虑什么

我看到有人提到
if
语句。我真的不明白这样的代码怎么会减慢代码的速度。如果条件为真,执行以下指令,否则跳转到另一组指令?我看到另一个帖子提到“分支预测”,也许这就是我真正迷路的地方。有什么可预测的?条件就在那里,它只能是真的或假的


我不相信这是一个复制品。链接的线程是指参照未排序数组的“分支预测”。我在问什么是分支以及为什么需要预测。

分支最简单的例子是if语句:

if (condition)
    doSomething();
现在,如果
条件
则执行
doSomething()
。如果不是,则执行分支,方法是跳转到
If
后面的语句

在非常简单的机器伪代码中,这可能被编译成以下内容:

TEST condition
JZ   label1       ; jump over the CALL if condition is 0
CALL doSomething
@@label1
分支点是
JZ
指令。后续执行点取决于
条件测试的结果

分支会影响性能,因为现代处理器会提前预测分支的结果并执行推测性执行。如果预测结果是错误的,那么投机的执行就必须解除

如果可以安排代码,使预测成功率更高,那么性能就会提高。这是因为推测执行的代码现在开销更小,因为它在需要之前就已经执行了。这是可能的,因为现代处理器是高度并行的。可以使用备用执行单元执行此推测性执行


现在,有一种代码从来没有分支预测失误。这就是没有分支的代码。对于无分支代码,推测执行的结果总是有用的。因此,在所有其他条件相同的情况下,没有分支的代码执行速度比有分支的代码快。

代码中的任何跳转都是分支。这发生在函数调用和循环的
if
语句中

现代CPU有很长的管道。这意味着CPU同时处理多条指令的各个部分。分支的问题是管道可能没有开始处理正确的指令。这意味着需要抛出推测指令,处理器需要从头开始处理指令

当遇到分支时,CPU尝试预测将使用哪个分支。这称为分支预测

分支预测的大多数优化都将由编译器完成,因此您实际上不需要担心分支


如果您已经分析了代码,并且可以看出这是一个问题,那么这可能属于只担心分支优化的类别。

分支是对正常控制流的偏离。处理器将按顺序执行指令,但在分支中,程序计数器会移动到内存中的另一个位置(例如,取决于条件的分支或过程调用)。

基本上可以想象工厂中的装配线。想象一下,当每个项目通过装配线时,它将进入员工1,然后是员工2,直到员工5。员工5处理完后,物品就完成了,可以打包了。因此,所有五名员工可以同时处理不同的项目,而不必相互等待。不过,与大多数装配线不同的是,每次employee 1开始处理一个新项目时,它都可能是一种新类型的项目,而不仅仅是一次又一次的相同类型的项目

好吧,不管出于什么奇怪和富有想象力的原因,想象一下经理正站在装配线的尽头。他有一张清单,上面写着:“先做这个项目,然后做那种类型的项目,然后再做那种类型的项目。”等等。当他看到员工5完成每个项目并继续下一个项目时,经理会告诉员工1开始处理哪种类型的项目,并查看它们当时在列表中的位置

现在让我们假设这个列表中有一个点——“计算机指令序列”——上面写着,“现在开始做一个咖啡杯。如果是晚上,你完成了杯子的制作,那么就开始做一顿冷冻晚餐。如果是白天,那么就开始做一袋咖啡渣。”这是你的If声明。因为在这种假例子中,经理不知道一天中的什么时候,直到他真正看到杯子喝完为止,他可以等到那个时候再叫下一道菜——要么是冷冻晚餐,要么是咖啡渣

问题是,如果要等到最后一秒,他必须等到最后一秒,才能完全确定一天中什么时候杯子喝完,下一个项目是什么,那么1-4号工人在5号工人喝完之前根本不会做任何事情。这完全违背了装配线的目的!所以经理猜测。工厂白天营业7小时,晚上只营业1小时。因此,这杯咖啡更有可能在白天喝完,从而保证咖啡渣的质量

因此,一旦员工2开始使用咖啡杯,经理就会向员工1发出咖啡渣的声音。然后,装配线继续向前移动,直到5号员工完成了杯子。这时,经理终于知道了一天的时间。如果是白天,那太好了!如果是晚上,一切都从自动对焦开始