讲师中心 微信公众号
AI工具推荐 视频效率加速

C++中的属性[[likely]]和[[unlikely]]是什么?(如何引导分支预测优化)

秋涛小哥_9722

秋涛小哥_9722

发布时间:2026-02-18 17:33:10

|

667人浏览过

|

来源于php中文网

原创

[[likely]]和[[unlikely]]是C++20标准属性,用于提示编译器分支概率,须紧贴if/switch语句块前,不改变逻辑;Clang13+/GCC12+支持,MSVC暂不支持。

c++中的属性[[likely]]和[[unlikely]]是什么?(如何引导分支预测优化)

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

它们告诉编译器:某条分支(比如 if 或 case)大概率会走或不会走,让编译器在生成机器码时把更可能执行的路径放在更顺直的位置(比如避免跳转、提升指令预取效率)。但它们不改变程序逻辑,也不保证优化一定发生——编译器可以忽略,且不同编译器支持程度不同。

  • [[likely]] 应该紧贴在 if、else if、switch 的语句块前,不能写在条件表达式里
  • [[unlikely]] 同理,常用于错误处理、边界检查等小概率路径
  • Clang 13+ 和 GCC 12+ 支持较稳定;MSVC 目前(v19.3x)仍不支持,用了会报错 error: unknown attribute 'likely'
  • 用错位置(比如加在函数声明上)会导致编译失败,不是警告

怎么写才合法:常见语法陷阱

这两个属性是 C++20 标准引入的属性,必须作用于「语句」而非「表达式」。最典型错误是把它当成 __builtin_expect 那样塞进条件里。

  • ✅ 正确:
    if (ptr) [[likely]] {
        process(*ptr);
    }
  • ❌ 错误:if (ptr [[likely]]) —— 属性不能修饰表达式
  • ❌ 错误:[[likely]] if (ptr) —— 顺序反了,属性必须紧跟被修饰的语句块
  • ⚠️ 注意:在 switch 中只能修饰单个 case 或 default 标签后的语句块,不能修饰整个 switch

和 __builtin_expect 比有什么区别?

老式 GCC 内建函数 __builtin_expect 是通过修改条件表达式的值来“骗”编译器,而 [[likely]] 是声明式提示,语义更干净,也更容易被静态分析工具识别。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • __builtin_expect(ptr != nullptr, 1) 实际返回的是 ptr != nullptr 的值,只是带 hint;容易误用(比如漏写第二个参数)
  • [[likely]] 不参与求值,无副作用,也不会影响 constexpr 上下文
  • 性能差异通常不大,但 [[likely]] 在跨平台项目中更安全——只要编译器支持,就不用写宏来隔离 __builtin_expect
  • 不过目前某些极端场景(如内核代码中对分支预测极度敏感的循环),__builtin_expect 的控制粒度仍略细一点

什么时候加、什么时候别加?

加了不一定快,加错了反而干扰编译器。关键看是否真有明确的运行时统计依据。

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

  • ✅ 值得加:if (unlikely_error) 类型的错误检查(如系统调用返回 -1)、日志开关(if (log_level >= DEBUG))、调试断言后置处理
  • ✅ 值得加:已知数据分布的热路径,比如哈希表查找中 if (bucket->occupied) 几乎总是 true
  • ❌ 别乱加:没有 profile 数据支撑的“我觉得这里大概率走”,尤其在模板代码或泛型容器中
  • ❌ 别加:频繁切换的路径(比如用户输入驱动的状态机),预测方向可能随输入反转,提示反而拖慢
  • ⚠️ 注意:启用 -O2 或更高优化级才可能生效;-O0 下基本被忽略
实际效果高度依赖具体代码结构和目标架构。没测过就加,跟没加差不多。

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1437

2024.03.13

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1029

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3300

2023.10.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

391

2026.03.13

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.12.07

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

0

2026.11.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn