1

我了解可能()/不太可能()宏的工作原理,并且我也了解分支预测。不幸的是,我没有在高级编程的上下文中学习分支预测。

我想知道的是,可能/不太可能宏中的评估是否导致分段错误,这对分支预测历史甚至当前结果/管道有何影响。

我不明白如果预测的验证没有完成,我们怎么知道它是成功还是失败?

4

1 回答 1

4

__builtin_expect(在可能/不太可能宏的定义中使用)不会生成实际代码来评估其任何一个参数。它所做的只是告诉编译器如果评估它会得到什么结果。

*(int*)NULL如果您告诉优化器通常是,它可能会使优化13器感到困惑,但是(除非编译器错误)它不会对编译器进行段错误,或生成在运行时出现段错误的代码。

关于旧问题的另一个答案是带有/不带有宏的实际 asm,表明它们的影响在于 gcc 如何布置代码(例如,将不太可能的情况自行排除,并将可能的情况放在失败未采取的一面条件分支,其中指令缓存未命中的可能性较小)。


这不是Linux 内核中可能()/不太可能()宏的完全重复——它们是如何工作的?他们有什么好处?,但您会发现更多关于这些宏如何工作以及它们对该问答的影响的信息。

于 2016-07-13T21:03:27.563 回答