【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一些新的有趣的知识点,感兴趣可以点个关注或者私聊,谢谢!
相关文章:
【C++ 20进阶(2):属性 Attribute】
【C 20进阶(2):属性 Attribute】 原文:https://blog.csdn.net/weixin_44259356/article/details/143663492 引言 本篇文章为系列文章将着重介绍C20新特性,一是希望可以和大家交流分享,二是也便于自己巩固…...
【系统面试篇】其他相关题目——虚拟内存、局部性原理、分页、分块、页面置换算法
目录 一、相关问题 1. 什么是虚拟内存?为什么需要虚拟内存? (1)内存扩展 (2)内存隔离 (3)物理内存管理 (4)页面交换 (5)内存映…...
力扣617:合并二叉树
给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠&#…...
软件设计师 - 第1章 计算机网络概论
计算机系统硬件基本组成 输入设备:键盘,鼠标输出设备:显示器,打印机...存储器:主存储器,如内存;辅助存储器,如外存运算器:与控制器一同集成在CPU中控制器:与…...
方案丨车险保单OCR:3秒钟完成保单审核
在涉及车辆交易的各种情况下,记录和管理车险保单信息是一项必不可少的任务。然而,面对数量庞大的电子保单,传统的手工录入方式显得尤为低效——它不仅消耗大量时间,而且容易出现错误,这不仅影响了用户的满意度…...
Jmeter中的监听器(一)
监听器 1--查看结果树 用途 调试测试计划:查看每个请求的详细信息,帮助调试和修正测试计划。分析响应数据:查看服务器返回的响应数据,验证请求是否成功。检查错误:识别和分析请求失败的原因。 配置步骤 添加查看结果…...
C++ 标准库 std::vector 的介绍
std::vector 是 C 标准库中的一个动态数组容器,它提供了多种成员函数来管理其内部存储的元素。以下是一些常用的 std::vector 成员函数的介绍: 构造函数和析构函数 vector(): 默认构造函数。vector(size_type n): 构造一个包含 n 个元素的向量…...
鸿蒙开发-装饰器@Link问题
正常示例 class Parent {public count: number;constructor( count: number) {this.count count;} } Entry Component struct TestPage {State parent: Parent new Parent( 11)build() {Column() {SubComponent({ parent: this.parent })}.height(100%)} } Component struct…...
CTFhub靶场RCE学习
靶场 eval执行 <?php if (isset($_REQUEST[cmd])) {eval($_REQUEST["cmd"]); } else {highlight_file(__FILE__); } ?> PHP代码显示,要求将命令赋值给cmd然后执行 先查看一下根目录文件 ?cmdsystem("ls");!切记最后的分…...
一文3000字从0到1带你进行Mock测试(建议收藏)
什么是mock? mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为 为什么要使用Mock? 之所以使用mock测试,是因…...
数据结构 ——— 链式二叉树的销毁(释放)
目录 链式二叉树示意图 手搓一个链式二叉树 代码实现 示意图 手搓一个链式二叉树 代码演示: // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struct BinaryTreeNode* left; //指向…...
log4j异常堆栈文件输出
目的:log4j异常堆栈关联到traceId一句话中,方便搜索 1、获取堆栈后一起打印 private void logException(Throwable t, ProceedingJoinPoint joinPoint) {if (this.printErrorStackSys) {StringWriter sw new StringWriter();PrintWriter pw new Print…...
在配置环境变量之后使用Maven报错 : mvn : 无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
最近,我在 Windows 系统上安装和配置 Apache Maven 时遇到了一些问题,想在此记录下我的解决历程,希望对遇到类似问题的朋友有所帮助。 问题描述 我下载了 Maven 并按照常规步骤配置了相关的环境变量。然而,在 PowerShell 中输入…...
SpringSecurity源码中核心类
SpringSecurity源码 第一部分 核心类 SecurityBuilderHttpSecurityWebSecuritySecurityFilterChainFilterChainProxy SecurityBuilder是安全构架器,HttpSecurity和WebSecurity都是SecurityBuilder的实现类,HttpSecurity通过build()构建了一个Security…...
【JAVA】使用IDEA创建maven聚合项目
【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目...
猿创征文|Inscode桌面IDE:打造高效开发新体验
猿创征文|Inscode桌面IDE:打造高效开发新体验 引言 在当今快速发展的软件开发领域,一个高效、易用的集成开发环境(IDE)是每个开发者必不可少的工具。Inscode 桌面 IDE 作为一款新兴的开发工具,凭借其强大…...
概率论中的PMF、PDF和CDF
在概率论中,PMF(概率质量函数)、PDF(概率密度函数)和CDF(累积分布函数)是描述随机变量分布的三个重要概念。它们分别用于不同类型的随机变量,并帮助我们理解随机事件的概率特性。本文…...
Vue 简单入手
前端工程化(Front-end Engineering)指的是在前端开发中,通过一系列工具、流程和规范的整合,以提高开发效率、代码质量和可维护性的一种技术和实践方法。其核心目的是使得前端开发变得更高效、可扩展和可维护。 文章目录 一、Vue 项…...
Github配置ssh key原理及操作步骤
文章目录 配置SSH第一步:检查本地主机是否已经存在ssh key第二步:生成ssh key第三步:获取ssh key公钥内容第四步:Github账号上添加公钥第五步:验证是否设置成功验证原理 往github上push项目的时候,如果走ht…...
大循环引起CPU负载过高
一、问题背景 环境:jdk1.8 tomcat7 在一次发布时,cpu出现负载过高,其负载突破200%,并且响应时间也大幅度超时。 二、问题分析 【1】发布前做过压测,并没有发现cpu异常升高的现象,所以其可能与生产环境的请…...
基于密度距离度量构建高质量科学仿真训练集:从原理到工程实践
1. 项目概述:从仿真数据到高质量训练集的桥梁在计算物理、流体力学或者天体物理模拟这类科学计算项目中,我们常常会生成海量的仿真数据。这些数据,比如一个随时间演化的等离子体密度场,其本身是复杂且高维的。直接把这些“原始矿石…...
医疗AI公平性评估:从数据复杂性到系统任意性的三支柱分析框架
1. 项目概述:当医疗AI遇上公平性拷问在医疗健康领域,机器学习模型正从实验室的“概念验证”阶段,大步迈向临床决策支持的“实战”前线。无论是预测糖尿病风险,还是辅助诊断心脏病,这些算法模型的核心承诺是:…...
LeetCode 523:连续的子数组和 | 前缀和同余定理
LeetCode 523:连续的子数组和 | 前缀和同余定理 引言 连续的子数组和(Continuous Subarray Sum)是 LeetCode 第 523 题,难度为 Medium。题目要求判断数组中是否存在长度至少为 2 的连续子数组,其元素和是 K 的倍数。这…...
Unity自定义碰撞与力场系统实战指南
1. 这不是“加个Rigidbody”就能解决的问题很多人在Unity里做物理交互,第一反应就是拖一个Rigidbody组件上去,再配个Collider,以为这就叫“用了物理引擎”。结果一跑起来:角色穿模、物体悬浮、力反馈生硬、粒子被撞飞得毫无逻辑……...
Kubernetes多租户管理:实现资源隔离与安全的完整指南
Kubernetes多租户管理:实现资源隔离与安全的完整指南 引言 在企业环境中,多租户管理是Kubernetes的重要功能。通过多租户管理,可以实现不同团队或客户之间的资源隔离和安全控制。这对于共享Kubernetes集群的场景尤为重要。 作为一名资深的Dev…...
3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南
3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and…...
8个必备的数据采集工具详解,低代码爬虫~
网络爬虫是一种常见的数据采集技术,你可以从网页、 APP上抓取任何想要的公开数据,当然需要在合法前提下。 爬虫使用场景也很多,比如: 搜索引擎机器人爬行网站,分析其内容,然后对其进行排名,比…...
2026论文写作工具红黑榜:AI论文网站怎么选?清单来了
2026年论文写作工具竞争白热化,红榜优先选千笔AI、ThouPen、豆包,适配国内学术规范,内容严谨且格式合规;黑榜需避开低质免费工具、无真实引用平台、过度依赖全文生成的工具。选择时可按需求匹配度 - 数据可信度 - 成本承受力三维模…...
Keil C166嵌入式开发中的宽字符实现与优化
1. 宽字符支持问题解析在嵌入式C语言开发中,Unicode支持是一个常见需求。最近我在使用Keil C166开发工具时遇到了一个关于宽字符(wchar_t)定义的有趣问题。打开标准库头文件stdlib.h时,发现其中对wchar_t的定义如下:#ifndef _WCHAR_T_DEFINED…...
AI代理运行时基础设施:从上下文溢出到持久化事件日志
1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了你有没有在深夜调试一个跑了三小时的 AI 代理,突然发现它开始胡言乱语?不是模型崩了,不是 prompt 写错了,而是——它的“记忆”被挤掉了。上下文窗口就那么大&…...
