我了解 possible()/unpossible() 宏的工作原理,我也了解分支预测。不幸的是,我没有在高级编程的上下文中学习分支预测。
我想知道的是,在可能/不太可能的宏中的评估是否会导致分段错误,这对分支预测历史甚至当前结果/管道有何影响。
我不明白,如果预测的验证没有完成,我们怎么知道它是成功还是失败?
__builtin_expect
(用于定义可能/不太可能的宏)不会生成实际代码来评估其任一参数。 它所做的只是告诉编译器如果评估它会发生什么结果。
如果你告诉优化器*(int*)NULL
通常是13
的,但它(除了编译器错误)它不会对编译器进行分段错误,或者生成在运行时段错误的代码,这可能会使优化器感到困惑。
关于旧问题的另一个答案是带有/没有宏的实际 asm,这表明它们的影响在于 gcc 如何布置代码(例如,将不太可能的情况单独搁置,以及条件分支的落差未采取侧的可能情况,其中指令缓存未命中的可能性较小)。
这不是 Linux 内核中可能()/不太可能()宏的复制品 - 它们是如何工作的?它们有什么好处?,但你会发现更多关于这些宏如何工作以及它们对问答的影响的信息。