C++20的[[likely]]和[[unlikely]]属性通过提示编译器优化代码布局与跳转指令,减少分支预测失败开销:前者将高概率路径前置以提升局部性,后者将低概率路径移至冷区以避免缓存污染。
![c++如何进行分支预测优化_c++ [[likely]], [[unlikely]]与代码布局【性能】-第1张图片-佛山资讯网 c++如何进行分支预测优化_c++ [[likely]], [[unlikely]]与代码布局【性能】-第1张图片-佛山资讯网](https://www.fsgp.cn/zb_users/upload/2025/12/20251220172022176622242291916.png)
在 C++ 中,分支预测优化的核心是**减少 CPU 分支预测失败带来的流水线冲刷开销**。现代 CPU 依赖预测器猜测 if/else、循环条件等跳转方向,预测错误会导致数个周期的性能损失。C++20 引入的 [[likely]] 和 [[unlikely]] 属性,就是让程序员显式告诉编译器“这条路径大概率会执行”或“大概率不会执行”,从而影响代码布局(如热代码前置)和底层汇编指令选择(如使用带预测提示的跳转指令)。
[[likely]] 与 [[unlikely]] 的作用机制
这两个属性本身不改变逻辑,只作为编译器优化提示:
-
[[likely]]建议编译器将该语句块(如 if 分支体、case 分支、goto 目标等)生成在更靠近当前指令流的位置,降低取指延迟;部分架构(如 x86-64)可能生成jcc指令的“强预测”编码形式。 -
[[unlikely]]则相反:编译器倾向于把该分支体放到远离主路径的内存区域(如函数末尾或单独 section),避免污染指令缓存热点,并可能选用更节省主路径空间的跳转序列。 - 它们只对直接修饰的语句有效,不能修饰整个 if 或 else 子句——需放在分支体首行(即左大括号后)或独立语句前。
正确用法示例与常见误用
✅ 正确写法(C++20 起支持):
if (ptr != nullptr) {
[[likely]] { // ✅ 修饰复合语句(C++20 允许)
process(*ptr);
}
} else {
[[unlikely]] { // ✅ 否则分支大概率不走
fallback();
}
}登录后复制
✅ 更常见的写法(修饰单条语句或空语句后接代码):
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~