C++20的[[likely]]和[[unlikely]]属性通过提示编译器优化代码布局与跳转指令,减少分支预测失败开销:前者将高概率路径前置以提升局部性,后者将低概率路径移至冷区以避免缓存污染。
在 C++ 中,分支预测优化的核心是**减少 CPU 分支预测失败带来的流水线冲刷开销**。现代 CPU 依赖预测器猜测 if/else、循环条件等跳转方向,预测错误会导致数个周期的性能损失。C++20 引入的 [[likely]] 和 [[unlikely]] 属性,就是让程序员显式告诉编译器“这条路径大概率会执行”或“大概率不会执行”,从而影响代码布局(如热代码前置)和底层汇编指令选择(如使用带预测提示的跳转指令)。
这两个属性本身不改变逻辑,只作为编译器优化提示:
[[likely]] 建议编译器将该语句块(如 if 分支体、case 分支、goto 目标等)生成在更靠近当前指令流的位置,降低取指延迟;部分架构(如 x86-64)可能生成 jcc 指令的“强预测”编码形式。[[unlikely]] 则相反:编译器倾向于把该分支体放到远离主路径的内存区域(如函数末尾或单独 section),避免污染指令缓存热点,并可能选用更节省主路径空间的跳转序列。✅ 正确写法(C++20 起支持):
if (ptr != nullptr) {
[[likely]] { // ✅ 修饰复合语句(C++20 允许)
process(*ptr);
}
} else {
[[unlikely]] { // ✅ 否则分支大概率不走
fallback();
}
}
✅ 更常见的写法(修饰单条语句或空语句后接代码):
if (size > 1024) {
[[likely]] ;
heavy_processing(data, size);
} else {
[[unlikely]] ;
light_path(data, size);
}
❌ 错误写法:
[[likely]] if (x > 0) { ... } —— 属性不能修饰 if 语句本身,语法错误。if (x > 0) [[likely]] { ... } —— 属性位置错,应紧贴语句块开头,不是跟在 if 后面。编译器利用 [[likely]]/[[unlikely]] 调整代码布局时,本质是让高频路径指令在内存中连续存放、局部性更好。你可以主动辅助:
inline 或 __attribute__((always_inline))),再在其关键分支加 [[likely]],确保热路径真正紧凑。[[likely]],跳转开销仍存在;不如把逻辑展开或用 constexpr 判断提前折叠。[[likely]] 标注主循环体,[[unlikely]] 标注 break/continue 条件或异常处理(如边界检查失败)。效果取决于编译器(GCC 12+/Clang 14+ 支持较完善)、目标架构(x86/arm64 效果明显,RISC-V 部分后端尚未完全支持)和运行时分支行为是否真符
合标注。
-O2 -march=native 编译,开启 -fprofile-generate + 运行 + -fprofile-use 可获得更优的自动分支优化;[[likely]] 是对 profile-guided optimization(PGO)的补充,不是替代。objdump -d 查看汇编,确认热路径是否被前置、跳转指令是否带 hint(如 x86 的 jne .Lhot 而非跳向远处的 .Lcold)。基本上就这些。属性只是提示,不是魔法;真正有效的分支优化,永远建立在理解数据分布、测量瓶颈、结合 PGO 和合理算法设计的基础上。
# go
# 编码
# 后端
# c++
# google
# 热点
# 架构
# if
# break
# continue
# goto
# 循环
# 算法
# 跳转
# 子句
# 放在
# 你可以
# 基础上
# 这两个
# 这条
# 可达
# 而非
# 跟在
相关文章:
nginx修改上传文件大小限制的方法
外贸公司网站制作,外贸网站建设一般有哪些步骤?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
C#怎么使用委托和事件 C# delegate与event编程方法
如何选择PHP开源工具快速搭建网站?
建站主机数据库如何配置才能提升网站性能?
网站制作模板下载什么软件,ppt模板免费下载网站?
Python文件管理规范_工程实践说明【指导】
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站之星上传入口如何快速找到?
如何在宝塔面板中修改默认建站目录?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
建站之星导航配置指南:自助建站与SEO优化全解析
相册网站制作软件,图片上的网址怎么复制?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
开心动漫网站制作软件下载,十分开心动画为何停播?
如何配置IIS站点权限与局域网访问?
智能起名网站制作软件有哪些,制作logo的软件?
个人网站制作流程图片大全,个人网站如何注销?
招贴海报怎么做,什么是海报招贴?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
制作企业网站建设方案,怎样建设一个公司网站?
C++如何使用std::optional?(处理可选值)
如何零成本快速生成个人自助网站?
教学网站制作软件,学习*后期制作的网站有哪些?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
高防服务器租用指南:配置选择与快速部署攻略
建站之星后台密码遗忘如何找回?
如何在腾讯云服务器上快速搭建个人网站?
如何选择适合PHP云建站的开源框架?
建站org新手必看:2024最新搭建流程与模板选择技巧
活动邀请函制作网站有哪些,活动邀请函文案?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
如何在自有机房高效搭建专业网站?
简单实现Android验证码
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
建站之星如何一键生成手机站?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
移民网站制作流程,怎么看加拿大移民官网?
网站制作公司排行榜,四大门户网站排名?
Java解压缩zip - 解压缩多个文件或文件夹实例
建站之星IIS配置教程:代码生成技巧与站点搭建指南
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
盘锦网站制作公司,盘锦大洼有多少5G网站?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
如何通过PHP快速构建高效问答网站功能?
如何解决VPS建站LNMP环境配置常见问题?
如何快速查询域名建站关键信息?
家庭建站与云服务器建站,如何选择更优?
*请认真填写需求信息,我们会在24小时内与您取得联系。