C++ Attribute 属性说明符

news2025/2/11 0:40:10

目录

  • 属性说明符 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
#endif

int 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 newnodiscard 的属性。

另一个使用场景是警告调用错误,比如在对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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2295305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学JDBC 第二日

数据库连接池 作用 使数据库连接达到重用的效果&#xff0c;较少的消耗资源 原理 在创建连接池对象时&#xff0c;创建好指定个数的连接对象 之后直接获取连接对象使用即可&#xff0c;不用每次都创建连接对象 从数据库连接池中获取的对象的close方法真的关闭连接对象了吗…

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动&#xff0c;会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…

【C语言标准库函数】三角函数

目录 一、头文件 二、函数简介 2.1. 正弦函数&#xff1a;sin(double angle) 2.2. 余弦函数&#xff1a;cos(double angle) 2.3. 正切函数&#xff1a;tan(double angle) 2.4. 反正弦函数&#xff1a;asin(double value) 2.5. 反余弦函数&#xff1a;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数据库是一款针对企业信息化管理而设计的高级数据库管理系统&#xff0c;主要应用于企业资源规划&#xff08;ERP&#xff09;、客户关系管理&#xff08;CRM&#xff09;以及办公自动化&#xff08;OA&#xff09…

激活函数篇 03 —— ReLU、LeakyReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…

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是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…

VMware虚拟机安装、创建Ubuntu虚拟机及汉化设置全流程详细教程

一、安装VMware Workstation 下载VMware 访问官网&#xff1a;https://www.vmware.com 选择适合的版本&#xff08;如 Workstation Pro 或 VMware Player&#xff0c;后者免费&#xff09;。完成下载后运行安装程序。 网盘下载&#xff1a; 链接: https://pan.baidu.com/s/1MQ…

21.2.7 综合示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 【例 21.7】【项目&#xff1a;code21-007】填充职员表并打印。 本例使用到的Excel文件为&#xff1a;职员信息登记表.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><!-- 登陆表单 …

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下载好安装包&#xff0c;如同安装软件一样&#xff0c;直接安装即可 win中默认为C盘&#xff0c;如果需要修改到其他盘&#xff0c;查找具体教程 运行list命令&#xff0c;检查是否安装成功 2、修改模型下载的…

如何在RTACAR中配置IP多播(IP Multicast)

一、什么是IP多播 IP多播&#xff08;IP Multicast&#xff09;是一种允许数据包从单一源地址发送到多个目标地址的技术&#xff0c;是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址&#xff0c;范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…

2025年最新版武书连SCD期刊(中国科学引文数据库)来源期刊已更新,可下载PDF版!需要的作者进来了解~

2025年最新版武书连SCD期刊&#xff08;中国科学引文数据库&#xff09;来源期刊已更新&#xff01; 官网是不提供免费查询的。小编给大家两个路径&#xff0c;无需下载PDF&#xff0c;随时随地都能查25版SCD目录。 路径一&#xff1a;中州期刊联盟官网&#xff0c;25版SCD目…

存储异常导致的Oracle重大生产故障

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

C++ Primer 成员访问运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…