首页 > 后端开发 > C++ > 正文

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

P粉602998670
发布: 2025-08-25 08:07:01
原创
313人浏览过
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

析稿Ai写作
析稿Ai写作

科研人的高效工具:AI论文自动生成,十分钟万字,无限大纲规划写作思路。

析稿Ai写作 142
查看详情 析稿Ai写作

常见宏定义方式:

#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 能在热点代码中带来可测量的性能提升,尤其是在分支高度可预测的场景下。不复杂但容易忽略。

以上就是C++分支预测优化 likely unlikely宏的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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