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

C++编译器属性实战:[[nodiscard]]、[[likely]]提升代码健壮性【契约编程】

梦枫同学_2964

梦枫同学_2964

发布时间:2026-01-19 14:56:47

|

615人浏览过

|

来源于php中文网

原创

[[nodiscard]] 不是加了就安全,因其仅在调用处对完全丢弃返回值触发警告,且依赖编译器警告级别、需逐个标注模板/重载,移动语义或类型差异(如 vector::at() 有而 operator[] 无)可能导致失效。

c++编译器属性实战:[[nodiscard]]、[[likely]]提升代码健壮性【契约编程】

为什么 [[nodiscard]] 不是加了就安全?

它只在调用处触发编译器警告,且仅当返回值被完全丢弃时才生效——比如 foo(); 或 (void)foo(); 会绕过检查,而 auto x = foo(); 却不使用 x 也不会报警。

  • 必须配合编译器警告级别启用:GCC/Clang 需 -Wnodiscard(C++17 起默认开启部分检查),MSVC 需 /wd5045 或更高警告等级
  • 对重载函数、模板实例化要逐个标注;std::vector::at() 有 [[nodiscard]],但 operator[] 没有,这是有意为之的设计差异
  • 自定义类型返回 [[nodiscard]] 对象时,移动语义可能抑制警告(如 return std::move(result); 在某些旧版 Clang 中失效)

[[likely]] 和 [[unlikely]] 真的能提速吗?

它们不改变逻辑,只向编译器提供分支预测偏好。实际收益高度依赖 CPU 架构、运行时数据分布和优化等级。O2/O3 下效果较明显,-O0 基本无作用。

  • 只对 if、switch 的具体分支标签生效,不能修饰整个函数或表达式
  • 错误标注反而降低性能:把高频路径标成 [[unlikely]] 会导致分支预测失败率飙升
  • Clang 对嵌套条件支持较好,GCC 12+ 才稳定支持 [[likely]] 在 if constexpr 中(C++20)
if (ptr == nullptr) [[unlikely]] {
    throw std::invalid_argument("null pointer");
} else [[likely]] {
    return *ptr;
}

契约编程中如何组合使用这两个属性?

核心是让接口意图可验证、关键路径可感知。比如资源获取函数必须检查返回值,错误分支应明确标记为小概率事件。

Windows 图片打印
Windows 图片打印

通过 Python 使用 mspaint /pt 在 Windows 上打印图像——绕过 bash 中文路径编码问题。

下载
  • 工厂函数、解析函数、系统调用封装建议统一加 [[nodiscard]],避免静默失败
  • 异常路径、边界校验失败、日志采样开关等低频逻辑,用 [[unlikely]] 引导代码布局,减少热路径指令缓存污染
  • 注意:二者不能解决运行时逻辑错误,只是强化静态契约;若函数本身未做充分校验(如没检查输入参数),加了 [[nodiscard]] 也拦不住误用
[[nodiscard]] std::optional<int> parse_int(const std::string& s) {
    char* end;
    long val = std::strtol(s.c_str(), &end, 10);
    if (*end != '\0') [[unlikely]] {
        return std::nullopt;
    }
    return static_cast<int>(val);
}

跨编译器兼容性怎么处理?

不是所有编译器都原生支持 C++20 属性语法,尤其在混合构建环境中(如 Windows 上用 MSVC 编译但链接 GCC 编译的库)。

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

  • 用宏封装最稳妥:#define NODISCARD [[nodiscard]],并在头文件顶部检测标准版本与编译器特性
  • MSVC 19.26+、GCC 9+、Clang 8+ 支持原生 [[nodiscard]];[[likely]] 则需 GCC 9+/Clang 10+/MSVC 19.28+
  • 旧编译器回退方案:GCC/Clang 可用 __attribute__((warn_unused_result)) 替代 [[nodiscard]],但无对应 likely 回退机制

实际项目里最容易忽略的是:属性只作用于声明,不继承。类成员函数加了 [[nodiscard]],派生类重写后必须显式再加,否则契约断裂。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

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

下载

相关标签:

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

热门AI工具

更多
花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

Loomy
Loomy Hot

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

WorkBuddy

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

SkildArt
SkildArt Hot

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

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

豆包大模型

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

相关专题

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

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

313

2023.09.26

define的用法
define的用法

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

619

2023.10.11

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

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3228

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5349

2025.10.17

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习

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

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