当前位置: 首页 > article >正文

【C++ 20进阶(2):属性 Attribute】

【C++ 20进阶(2):属性 Attribute】

原文:https://blog.csdn.net/weixin_44259356/article/details/143663492

引言

本篇文章为系列文章将着重介绍C++20新特性,一是希望可以和大家交流分享,二是也便于自己巩固学习

历史系列:

【C++ 20进阶(1):模块导入 import】

0,介绍

属性是一种编译器厂商用于编译的特定机制(注意区别于java的属性),C++11之前由编译器厂商自行制定,如_attribute_等,C++11之后制定了统一标准,使用[[]]对属性进行支持。如[[nodiscard]](这里很多同学可能没什么概念,正常使用比较少见,通常见于底层如操作系统使用较多,具体可以见我下面的例子)。

1,C++20之前的属性

a. [[nodiscard]]

用于有返回值的函数,添加此属性后,如果代码没有对返回值进行处理,将会编译告警。如:

[[nodiscard]] auto f() // 这里auto为20新增类型推导,后续系列将会介绍
{
    return 0;
}
int main()
{
    f(); // 不处理返回值编译器将告警
}

在C++20中还可以这样用

[[nodiscard("必须要处理此函数返回值")]] auto f() // 双引号内可以添加告警原因

b.[[maybe_unused]]

用于禁止编译器在有变量未使用时发出告警,告警通常发生在编译器告警等级设置较高时。如:

auto f(int a, int b) // 未使用a或者b时编译器将告警
{
    return 0;
}
auto f(int a, [[maybe_unused]] int b) // b变量编译器将不会告警,a任然会告警
{
    return 0;
}

[[maybe_unused]]还可用于类,结构体,函数等等,后面系列将会进一步介绍。

c.[[noreturn]]

使用此属性意味着函数永远不会返回调用栈的上一级,一般用于异常处理,或者程序终止。如:

[[noreturn]] void f() // 不添加此属性,编译器将会告警
{
    std::exit(1); // 程序将终止
}

d.[[deprecated]]

添加此属性意味着内容已被弃用,你还可以用,但是不推荐使用,此属性还可添加原因。如:

[[deprecated("性能较差,请尽量避免使用此函数")]] void f(); // 引号内容为原因,使用此函数编译器将会告警,并提示原因。

2,C++20之后的属性

a.[[likely]]/[[unlikely]]

可用于代码优化,告诉编译器什么分支更加可能被执行,或者不太可能被执行,从而提升性能。如:

if (int a{}; a > 0) // 初始化器,C++17后可用,本系列重点讲解C++20,C++20以前感兴趣可以留言
{
}
else if (a == 0) [[likely]] // 此分支将更加可能被执行
{
}
else [[unlikely]] // 此分支将不太可能被执行
{
}

通常现代编译器不加此属性也能预测分支执行概率,从而优化性能,但上述例子如果出现在对性能要求很高的情况下,能更加有效的提升性能。

后续我将继续分享C++20一些新的有趣的知识点,感兴趣可以点个关注或者私聊,谢谢!


http://www.kler.cn/a/391849.html

相关文章:

  • docker镜像源,亲测可用,时间2024-11-14
  • Rust 所有权机制
  • java导出pdf
  • webpack loader全解析,从入门到精通(10)
  • 物理设备命名规则(Linux网络服务器 15)
  • C++初阶——list
  • 深度学习:昇思MindSpore生态桥接工具——MindTorch实践
  • 设计模式之抽象工厂模式(替换Redis双集群升级,代理类抽象场景)
  • 常用中间件介绍
  • Linux(CentOS)开放端口/关闭端口
  • Windows10下局域网的两台电脑间传输文件
  • 2024年9月青少年软件编程(C语言/C++)等级考试试卷(七级)
  • MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3
  • AutoDL使用经验
  • vue3使用element-plus,树组件el-tree增加引导线
  • 基于交互多模型 (IMM) 算法的目标跟踪,使用了三种运动模型:匀速运动 (CV)、匀加速运动 (CA) 和匀转弯运动 (CT)。滤波方法为EKF
  • Windows下使用adb实现在模拟器中ping
  • AI制作表情包,每月躺赚1W+,完整流程制作多重变现教学
  • 通过pin_memory 优化 PyTorch 数据加载和传输:工作原理、使用场景与性能分析
  • 探索MoviePy:Python视频编辑的瑞士军刀
  • C/C++每日一练:编写一个查找子串的位置函数
  • PyQt5 加载UI界面与资源文件
  • django博客项目实现站内搜索功能
  • Could not initialize class sun.awt.X11FontManager
  • React Hooks在现代前端开发中的应用
  • vue3+ant design vue实现表单模糊查询