0

0

C++分支预测优化 likely unlikely宏

P粉602998670

P粉602998670

发布时间:2025-08-25 08:07:01

|

319人浏览过

|

来源于php中文网

原创

C++20引入[[likely]]和[[unlikely]]属性以优化分支预测,提示编译器某分支更可能或更不可能执行,结合__builtin_expect可兼容旧编译器,常用于错误处理、空指针检查等场景,正确使用可提升性能。

c++分支预测优化 likely unlikely宏

在C++中,特别是在对性能要求较高的场景下,分支预测优化可以帮助编译器生成更高效的机器码。现代CPU使用流水线技术,当遇到条件分支时,如果能提前“猜测”哪条路径更可能被执行,就可以提前加载指令,减少流水线停顿。如果预测错误,就要回退并重新加载,造成性能损失。

为了帮助编译器更好地进行分支预测,C++20引入了 likelyunlikely 关键字作为“属性”(attributes),允许程序员显式提示某个分支更可能或更不可能被执行。

likely 和 unlikely 的语法

这两个属性属于C++20标准中的 [[likely]][[unlikely]],用于标注语句块,通常用在 if、switch 或 goto 语句中。

// 示例:使用 likely 提示“条件为真”的分支更可能发生

if (ptr != nullptr) [[likely]] {
    return ptr->value;
}

// 示例:使用 unlikely 提示“条件为假”的分支更可能发生

if (error_occurred) [[unlikely]] {
    handle_error();
}

注意:[[likely]] 和 [[unlikely]] 作用于整个复合语句(即花括号块),而不是 if 条件本身。

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

宏定义兼容旧版本编译器

如果你使用的编译器不支持C++20,或者需要兼容旧标准,可以通过宏来模拟这些属性。主流编译器如GCC和Clang早已支持类似的内置函数 __builtin_expect

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载

常见宏定义方式:

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

// 使用宏

if (likely(ptr != nullptr)) {
    do_something();
}

if (unlikely(error_flag)) {
    log_error();
}

这里 __builtin_expect(expr, likely_value) 告诉编译器 expr 的值“期望”为 likely_value(1 表示真,0 表示假),从而优化分支跳转指令的生成。

使用建议与注意事项

虽然分支预测提示能提升性能,但使用时需谨慎:

  • 只在性能关键路径上使用,比如内层循环、高频调用函数
  • 确保预测方向正确,错误的提示反而会降低性能
  • 常见使用场景:错误处理(unlikely)、空指针检查(unlikely)、默认情况(likely)
  • C++20 属性更安全,宏更灵活但依赖编译器支持
  • 在GCC、Clang中 __builtin_expect 从较早版本就已支持,MSVC需使用其他方式或依赖编译器自动优化

基本上就这些。正确使用 likely/unlikely 能在热点代码中带来可测量的性能提升,尤其是在分支高度可预测的场景下。不复杂但容易忽略。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

108

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

337

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

773

2023.08.22

switch语句用法
switch语句用法

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

536

2023.09.21

Java switch的用法
Java switch的用法

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

422

2024.03.13

go语言goto的用法
go语言goto的用法

本专题整合了go语言goto的用法,阅读专题下面的文章了解更多详细内容。

136

2025.09.05

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

27

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

7

2026.01.26

热门下载

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

精品课程

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

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.9万人学习

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

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