0

0

c++ 属性化编程 c++20的[[likely]]和[[unlikely]]如何使用

幻夢星雲

幻夢星雲

发布时间:2026-03-18 16:00:31

|

400人浏览过

|

来源于php中文网

原创

[[likely]]和[[unlikely]]是C++20标准的编译器优化提示,用于指导分支预测优化,不改变程序逻辑,仅在启用优化(如-O2)时生效,须置于if/else if/switch语句块开头,不可嵌套或用于表达式。

c++ 属性化编程 c++20的[[likely]]和[[unlikely]]如何使用

[[likely]] 和 [[unlikely]] 是编译器提示,不是运行时控制

它们不改变程序逻辑,只建议编译器对分支做不同优化:把 [[likely]] 标记的路径按“大概率走”生成更紧凑、更利于流水线的机器码;[[unlikely]] 则相反,常用于错误处理、边界检查等小概率路径。主流编译器(GCC 12+、Clang 13+、MSVC 19.30+)支持,但若编译器忽略或未启用优化(如 -O0),这些属性完全无效。

常见错误现象:[[likely]] 加在永远不执行的分支上,结果性能反而变差——因为编译器信了你,把冷代码塞进热路径的指令缓存区;或者在调试构建中反复验证行为,却忘了它本就不该影响逻辑。

  • 只用在 ifelse ifswitch 的语句块开头,不能标在表达式或函数声明上
  • 不要嵌套使用,比如 if (x) [[likely]] { if (y) [[unlikely]] { ... } } —— 外层提示已覆盖上下文,内层易被忽略
  • 配合 -O2 或更高优化等级使用,-Og 下部分编译器可能不生效

实际写法:紧跟在 if/else if/switch 后,同一行或换行都可

语法宽松,但位置敏感:必须直接修饰目标语句块,不能隔空或插在条件表达式中间。C++20 标准只要求它出现在语句前,不强制绑定到某个 token。

典型场景:系统调用返回值检查、无锁队列的空/满判断、配置开关的默认分支。

立即学习C++免费学习笔记(深入)”;

Riffo
Riffo

Riffo是一个免费的文件智能命名和管理工具

下载
if (ptr != nullptr) [[likely]] {
    use(ptr);
} else [[unlikely]] {
    handle_null();
}

switch (status) {
    case OK: [[likely]] {
        commit();
        break;
    }
    case TIMEOUT: [[unlikely]] {
        retry();
        break;
    }
}
  • [[likely]][[unlikely]] 是独立属性,不是成对关键字,不必一一对应
  • 不能写成 if [[likely]] (x) { ... } —— 属性必须在 if 后、左大括号前
  • 宏封装需谨慎:比如 #define LIKELY [[likely]] 可用,但 #define IF_LIKELY(x) if (x) [[likely]] 易引发宏展开歧义

和传统分支预测提示(如 __builtin_expect)比有什么区别

__builtin_expect 是 GCC/Clang 特有内建函数,要改写条件表达式:if (__builtin_expect(ptr != nullptr, 1));而 [[likely]] 更干净,不污染逻辑表达式,也更易读。但兼容性差:老项目用 __builtin_expect 还得保留,跨平台时还得加宏适配。

性能影响取决于后端优化质量。实测显示,在热点循环中,[[likely]] 对 GCC 13 的分支折叠(branch folding)和跳转预测 hint 有明显作用;但 Clang 14 在某些间接跳转场景下仍更依赖 __builtin_expect

  • 已有 __builtin_expect 的代码,不急着全换,尤其涉及内联汇编或手写 asm 模板时
  • 新项目优先用 [[likely]],但别假设它能替代 profile-guided optimization(PGO)
  • Windows + MSVC 下,[[likely]] 支持较晚(19.30 起),且对 x86/x64 行为一致,ARM64 上效果尚未广泛验证

容易被忽略的细节:作用域、模板和 constexpr 环境

属性只作用于紧邻的语句块,不穿透作用域。在模板中可用,但实例化时才由具体类型决定是否触发优化;constexpr 函数里允许写,但编译期求值阶段这些提示不生效——只有生成的运行时代码才可能被优化。

一个隐蔽坑:lambda 表达式内部用 [[likely]],若 lambda 被捕获并延迟执行(比如塞进 std::function),提示依然只影响 lambda 定义处的分支,不影响调用时机的运行时预测。

  • 类成员函数内、构造函数初始化列表里不能用——那里没有语句块可修饰
  • constexpr if 不支持 [[likely]],因为它是编译期分支,不生成运行时跳转
  • 宏定义中混用 [[likely]]#ifdef 时,注意预处理器不识别属性,可能意外删掉整行
实际效果高度依赖编译器版本、目标架构和整体优化策略。别把它当银弹,先用 perf / VTune 确认分支是瓶颈,再加提示;加完务必对比 -O2 下的 LBR(Last Branch Record)或分支误预测率,而不是只看吞吐。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

7

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

22

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

143

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

16

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

15

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

10

2026.03.17

mulerun骡子快跑入口地址汇总
mulerun骡子快跑入口地址汇总

本专题整合了mulerun入口地址合集,阅读专题下面的文章了解更多详细内容。

269

2026.03.17

源码编译安装Nginx详解:模块选择、依赖准备与常见错误排查
源码编译安装Nginx详解:模块选择、依赖准备与常见错误排查

本专题详解Nginx源码编译全流程:从GCC、OpenSSL等依赖准备,到按需定制HTTP/SSL/流媒体模块的configure参数策略。深入剖析“缺少库文件”、“配置选项冲突”及“权限错误”等常见报错,提供精准排查思路与解决方案。助您掌握灵活构建高性能、定制化Nginx的核心技能,满足复杂生产环境需求。

5

2026.03.17

Linux环境安装Nginx全流程:apt、yum与源码编译方式深度实操
Linux环境安装Nginx全流程:apt、yum与源码编译方式深度实操

本专题深度实操Linux下Nginx三大安装方式:apt/yum包管理器快速部署,适合新手与标准化运维;源码编译灵活定制模块,满足高性能与特殊需求场景。内容涵盖环境准备、依赖安装、配置优化及平滑升级策略,对比各方案优劣,助您根据业务场景选择最佳实践,构建稳定高效的Web服务基石。

6

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号