C++ Attribute 属性说明符
目录
- 属性说明符 Attribute
- 编译警告相关
- [[deprecated]]
- [[maybe_unused]]
- [[fallthrough]]
- [[nodiscard]]
- 可能触发编译优化
- [[noreturn]]
- [[likely]]、[[unlikely]]
- [[assume]]
- [[carries_dependency]]
- [[no_unique_address]]
属性说明符 Attribute
属性说明符Attribute自C++11起,允许程序员给编译器提供额外的信息让其对程序进行优化、检查、约束。
它并不是新东西,各家编译器本来就有自带的各种属性,标准属性把一些经典的属性给标准化了
编译警告相关
这类属性和编译期警告有关,不会影响最终编译出的程序。
-
可以打开和关闭
-
最为常用,且不容易出错的属性。
[[deprecated]]
指示声明有此属性的名字或实体被弃用,即允许但因故不鼓励使用。实体包括类型(struct,class,union)、别名、变量、非静态数据成员、函数、命名空间,枚举类型、枚举类型中的一项、模版特化这些实体。
使用案例:
[[deprecated("Please use int foo2()")]]int foo() { return 2;}
如果调用foo函数,编译器就会报警告:
<source>:9:15: warning: 'int foo()' is deprecated: Please use int foo2() [-Wdeprecated-declarations]9 | return foo();| ~~~^~
[[maybe_unused]]
抑制对未使用实体的警告。
实体包括类型(struct,class,union)、别名、变量、非静态数据成员、函数、命名空间,枚举类型、枚举类型、结构化绑定。
典型的场景是关闭一些因为log级别变化而产生未使用变量编译警告:
#ifdef ENABLE_DEBUG_LOG
#define LOG_DEBUG(x) { std::cout <<"D: " << x <<"\n";}
#else
#define LOG_DEBUG(x) // nothing
#endifint foo() {[[maybe_unused]]const char* errorMessage="Wrong";// 生产环境中debug级别的日志不会被打印,所以errorMessage实际上是不会被使用的LOG_DEBUG(errorMessage)return 0;
}
[[fallthrough]]
指示switch语句中从前一标号直落是有意的,而在发生直落时给出警告的编译器不应诊断它。
void f(int n)
{int local{0};switch (n){case 1:case 2:local += 1;[[fallthrough]];case 3: // 直落时不警告local *= 2;case 4:while (false){[[fallthrough]]; // 非良构:下一语句不是同一迭代的一部分}case 6:[[fallthrough]]; // 非良构:没有后继的 case 或 default 标号}
}
[[nodiscard]]
可被用于函数声明、类声明、枚举类型声明中。
不是 void 的 弃值表达式(discarded-value expression)(即非返回值未被接收的表达式)中,则鼓励编译器发布警告。
调用声明为 nodiscard 的函数,或
调用按值返回声明为 nodiscard 的枚举或类的函数,或
以显式类型转换或 static_cast 形式调用声明为 nodiscard 的构造函数,或
以显式类型转换或 static_cast 形式构造声明为 nodiscard 的枚举或类的对象,
它有好几个使用场景:
- 迫使程序员检查错误码,如下:
enum class[[nodiscard]] ErrorCode {Success,Wrong
};// 当调用该函数却没有检查其返回值时,会报编译警告
ErrorCode foo() {return ErrorCode::Success;
}
-
警告资源泄露,比如程序员分配了内存却不使用它,这会造成资源泄露。
因此
operator new有nodiscard的属性。
另一个使用场景是警告调用错误,比如在对C++容器不熟悉的程序员很容易将容器的成员函数empty()认为是清空容器,因此几乎所有容器的empty() 成员函数都有nodiscard属性,一旦发生调用该函数却不检查返回值,大概率是empty()被错误使用了。
可能触发编译优化
这类属性可能触发编译优化,这些优化会影响最终编译出来的程序。这些属性可能会引发程序错误,谨慎使用。
[[noreturn]]
编译器会根据这个属性对程序进行优化,比如会直接忽略在该函数之后的代码。
- 告诉编译期函数不会返回,直接终止程序。
- 如果该函数返回,那么程序行为未定义。
[[likely]]、[[unlikely]]
允许编译器为包含该语句的执行路径,比任何其他不包含该语句的执行路径,更可能或更不可能的情况进行优化。
- 可用于
if语句 - 可用于
switch语句
编译器可能会根据该属性更改代码布局,比如对instruction cache更加友好。它不会影响芯片的分支预测功能,貌似没有指令可以指导分支预测电路。
[[assume]]
指示表达式在给定的位置永远会求值为true,编译器会根据该属性进行编译优化。
假设在不成立时会导致未定义行为,所以不建议使用。
[[carries_dependency]]
用来传递std::memory_order中release-consume的依赖链进入函数,这允许编译器跳过不必要的内存栅栏指令。
不推荐使用,甚至有专门的P0371R1: Temporarily discourage memory_order_consume用来传递std::memory_order中release-consume的依赖链进入函数,这允许编译器跳过不必要的内存栅栏指令。不推荐使用paper。
[[no_unique_address]]
允许此数据成员与其类的其他非静态数据成员或基类子对象重叠。
可以用来优化空类成员变量,编译器可将它优化为不占空间,就像空基类优化一样。
struct Empty {};
// 使用空基类优化
struct EmptyBaseOptimization: public Empty {int i;
};
struct Foo_noOpt {Empty empty;int i;
};
// 使用[[no_unique_address]]
struct Foo_Opt {[[no_unique_address]] Empty empty;int i;
};int main() {// 空类也是有大小的static_assert(sizeof(Empty) == 1);// 空基类优化会使得空基类不占用空间static_assert(sizeof(EmptyBaseOptimization) == 4);// 空类的成员也会占用内存空间,为了对齐,占据四个字节static_assert(sizeof(Foo_noOpt) == 8);// Foo_Opt对空类成员使用了[[no_unique_address]]属性,它被优化掉了static_assert(sizeof(Foo_Opt) == 4);
}
相关文章:
C++ Attribute 属性说明符
目录 属性说明符 Attribute编译警告相关[[deprecated]][[maybe_unused]][[fallthrough]][[nodiscard]] 可能触发编译优化[[noreturn]][[likely]]、[[unlikely]][[assume]][[carries_dependency]][[no_unique_address]] 属性说明符 Attribute 属性说明符Attribute自C11起&#…...
Elasticsearch去分析目标服务器的日志,需要在目标服务器上面安装Elasticsearch 软件吗
Elasticsearch 本身并不直接收集目标服务器的日志,它主要用于存储、搜索和分析数据。要收集目标服务器的日志,通常会借助其他工具,并且一般不需要在目标服务器上安装 Elasticsearch 软件,常见的日志收集方案: Filebeat…...
学JDBC 第二日
数据库连接池 作用 使数据库连接达到重用的效果,较少的消耗资源 原理 在创建连接池对象时,创建好指定个数的连接对象 之后直接获取连接对象使用即可,不用每次都创建连接对象 从数据库连接池中获取的对象的close方法真的关闭连接对象了吗…...
Android双屏异显Presentation接口使用说明
在点餐、收银、KTV等场景,对于双屏异显的需求是非常多的,首先可以节省硬件成本。而现在的智能板卡很多运行Android系统,从Android4.2开始支持WiFi Display(Miracast)功能后,就开始支持双屏异显Presentation这套应用层接口了,下面以Android5.1系统来说明这套接口的使用要…...
【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据
一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址: https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动,会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…...
JDK 9新特性学习大纲
第1部分:引言与背景 第1章:JDK 9的诞生与目标 1.1 JDK 9的核心目标与设计哲学 1.2 JDK 9的重要更新概览 1.3 兼容性与升级策略 第2部分:模块化系统(Project Jigsaw) 第2章:模块化基础 2.1 模块化的背景…...
【C语言标准库函数】三角函数
目录 一、头文件 二、函数简介 2.1. 正弦函数:sin(double angle) 2.2. 余弦函数:cos(double angle) 2.3. 正切函数:tan(double angle) 2.4. 反正弦函数:asin(double value) 2.5. 反余弦函数:acos(double value)…...
Redisson全面解析:从使用方法到工作原理的深度探索
文章目录 写在文章开头详解Redisson基本数据类型基础配置字符串操作列表操作映射集阻塞队列延迟队列更多关于Redisson详解Redisson 中的原子类详解redisson中的发布订阅模型小结参考写在文章开头 Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细…...
声明式导航,编程式导航,导航传参,下拉刷新
1.页面导航 1.声明式导航 1.1跳转到tabBar页面 1.2跳转到非tabBar页面 1.2后退导航 、 2.编程式导航 2.1跳转到tabBar页面 2.1跳转到非tabBar页面 2.3后退导航 3.导航传参 3.1声名式导航传参 3.2编程式导航传参 3.3在onLoad中接受参数 4.下拉刷新 4.1回顾下拉刷新…...
金和OA C6 DownLoadBgImage任意文件读取漏洞
金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统,主要应用于企业资源规划(ERP)、客户关系管理(CRM)以及办公自动化(OA)…...
激活函数篇 03 —— ReLU、LeakyReLU、ELU
本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归:Sigmoid函数在分类问题中的应用 整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元&a…...
UdpServer
Udp服务端: using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using System.IO; using …...
PromptSource安装报错
一、现象 运行命令:streamlit run promptsource/app.py 报错: streamlit run promptsource/app.py Traceback (most recent call last): File "/usr/local/bin/streamlit", line 5, in <module> from streamlit.cli import main File …...
前端学习-页面尺寸事件以及阻止默认行为(三十三)
目录 前言 页面尺寸事件 语法 检测屏幕宽度 获取宽高 元素尺寸的位置 总结 示例代码 阻止默认行为 阻止冒泡 语法 阻止冒泡如何做 阻止元素默认行为如何做 总结 前言 晚上好各位 页面尺寸事件 会在窗口尺寸改变的时候触发条件 语法 window.addEventListener(…...
Kafka 入门与实战
一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…...
5 计算机网络
5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…...
【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
一、题目描述 某公司研发了一款高性能AI处理器,每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0~3的处理器处于同一链路中,编号4~7的处理器处于另外一个链路中,不同链路中的处理器不能通信,如…...
程序员也可以这样赚钱
最近有朋友和我交流了关于程序员副业的想法,我想借这个机会对目前软件开发常用的兼职平台做一个梳理。 以下是程序员接副业的靠谱平台推荐,结合政策合规性、平台口碑及实际操作性整理,覆盖国内外主流选择: 一、国内综合型平台 程序…...
VMware虚拟机安装、创建Ubuntu虚拟机及汉化设置全流程详细教程
一、安装VMware Workstation 下载VMware 访问官网:https://www.vmware.com 选择适合的版本(如 Workstation Pro 或 VMware Player,后者免费)。完成下载后运行安装程序。 网盘下载: 链接: https://pan.baidu.com/s/1MQ…...
HTTP协议学习大纲
第一阶段:HTTP基础概念 互联网与Web基础 理解Web工作原理:客户端-服务器模型URL与URI的结构及区别端口、协议、域名概念 HTTP协议概览 HTTP的作用与特点(无状态、无连接、可扩展)HTTP协议版本演进(0.9 → 1.0 → 1.1 …...
系统URL整合系列视频四(需求介绍补充)
视频 系统URL整合系列视频四(需求补充说明) 视频介绍 (全国)大型分布式系统Web资源URL整合需求(补充)讲解。当今社会各行各业对软件系统的web资源访问权限控制越来越严格,控制粒度也越来越细。…...
21.2.7 综合示例
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 【例 21.7】【项目:code21-007】填充职员表并打印。 本例使用到的Excel文件为:职员信息登记表.xlsx&#x…...
【大模型】DeepSeek与chatGPT的区别以及自身的优势
目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…...
burpsuite抓取html登陆和上传数据包
一、burpsuite抓取html登陆数据包 1、先写一个html格式的登陆页面 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><title>这是标签</title></head> <body> <hr><!-- 登陆表单 …...
python 使用OpenAI Whisper进行显卡推理语音翻译
目录 一、Whisper简介 二、模型资料 三、实操案例 3.1 默认使用CPU进行推理 3.2 使用GPU进行推理 四、性能分析 一、Whisper简介 Whisper由 OpenAI 开发的这款强大模型,能轻松将语音转化为文字,并且支持多种语言(如英语、中文、西班牙语等),让全球沟通无障碍。 不仅…...
余数相同问题(信息学奥赛一本通-1080)
【题目描述】 已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。请问满足上述条件的x的最小值是多少?数据保证x有解。 【输入】 一行,三个不大于…...
用 Python 给 Excel 表格截图(20250207)
我搜索了网络上的方案,感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径,因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文,因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案,主要弥补…...
Linux 安装 Ollama
1、下载地址 Download Ollama on Linux 2、有网络直接执行 curl -fsSL https://ollama.com/install.sh | sh 命令 3、下载慢的解决方法 1、curl -fsSL https://ollama.com/install.sh -o ollama_install.sh 2、sed -i s|https://ollama.com/download/ollama-linux|https://…...
使用Ollama本地部署deepseek
1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包,如同安装软件一样,直接安装即可 win中默认为C盘,如果需要修改到其他盘,查找具体教程 运行list命令,检查是否安装成功 2、修改模型下载的…...
如何在RTACAR中配置IP多播(IP Multicast)
一、什么是IP多播 IP多播(IP Multicast)是一种允许数据包从单一源地址发送到多个目标地址的技术,是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址,范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…...
