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

C 语言编程 — GCC Attribute 语法扩展

目录

文章目录

  • 目录
  • Attribute 属性扩展机制
  • `__attribute__((packed))`
  • `__attribute__((aligned(n)))`
  • `__attribute__((noreturn))`
  • `__attribute__((unused))`

Attribute 属性扩展机制

GCC 的特点之一就是 Attribute 语法扩展机制,通过使用 __attribute__ 关键字可以设置以下对象的扩展属性,它提供了一种灵活的方式来控制编译器的行为,可以用于优化代码、实现特定的功能或者调整内存布局等。

  1. 函数属性(Function Attribute):修饰某个函数。
  2. 变量属性(Variable Attribute):修饰某个变量。
  3. 类型属性(Type Attribute):修饰某个类型。

__attribute__((packed))

__attribute__((packed)) 属于 Type Attribute,用于告诉 GCC 取消对 struct 或 union 的默认内存对齐行为,而是按照实际占用字节数进行对齐,从而减小内存占用。

例如:下述 my_struct 默认的内存对齐被取消了,所以占有空间是 12Byte 了,而是紧凑的 7Byte。

struct my_struct {char c1;int  i;char c2;
} __attribute__((packed));

__attribute__((aligned(n)))

__attribute__((aligned(n))) 属于 Type Attribute 和 Type Attribute,用于指定变量或类型的内存对齐方式,其中 n 表示对齐系数。

例如:下述将成员 int i 将被 GCC 对齐到 16Byte 的整数倍地址上,从而提高了内存访问效率。

struct my_struct {char c1;int i __attribute__((aligned(16)));char c2;
};

__attribute__((noreturn))

__attribute__((noreturn)) 属于 Function Attribute,用于告诉 GCC 特定的函数永远不会返回,从而帮助 GCC 对其进行优化。

例如:下述 my_exit 函数不会返回,函数栈帧可以不存储返回值。

void my_exit(int status) __attribute__((noreturn));

__attribute__((unused))

__attribute__((unused)) 属于 Variable Attribute 或 Function Attribute,用于告诉 GCC 某个变量或函数未被使用,从而避免 GCC 发出警告。

例如:下述 my_function 被标记为未被使用,GCC 可以不发出警告。

void my_function(int a, int b, int c) __attribute__((unused));

在上述代码中,由于使用了unused属性,函数my_function将被标记为未被使用,从而避免编译器发出警告。

http://www.lryc.cn/news/29201.html

相关文章:

  • LeetCode 热题 C++ 399. 除法求值 406. 根据身高重建队列
  • 提升Mac使用性能的5大方法,CleanMyMacX 2023非常的好用哦~
  • 一步一步学会给Fritzing添加元器件-丰富你的器件库
  • STM32 10个工程篇:1.IAP远程升级(一)
  • 高通Android 13默认切换免提功能
  • MySQL入门
  • 实验一 Python编程基础
  • java多线程(十五)ThreadLocal介绍和理解
  • K8S 实用工具之三 - 图形化 UI Lens
  • HDMI协议介绍(六)--EDID
  • 【项目实战】Linux下安装Nginx教程
  • 【数据结构】链式二叉树
  • CentOS安装RStudio-Server的方法
  • 从交通信号灯看流控和拥塞控制
  • 【LinkedList】| 深度剥析Java SE 源码合集Ⅰ
  • 黑马程序员7
  • Qt安装与使用经验分享;无.pro文件;无QTextCodec file;Qt小试;界面居中;无缝;更换Qt图标;更换Qt标题。
  • AAAI顶会行人重识别算法详解——Relation Network for Person Re-identification
  • hadoop调优(二)
  • 【基础算法】双指针---数组元素的目标和
  • Javascript借用原型对象继承父类型方法
  • 你不会工作1年了连枚举都还不知道吧?
  • ks通过恶意低绩效来变相裁员(五)绩效申诉就是「小六自证吃了一碗凉粉」
  • 一阶低通滤波介绍及simulink模型
  • 三十三、MongoDB PHP 扩展
  • 2D图像处理:九点标定_上(机械手轴线与法兰轴线重合)(附源码)
  • 2023最新C++面经(一):vector内存预分配,左值引用和右值引用,move语义
  • 【C语言经典例题】调整数组使奇数全部都位于偶数前面
  • C++经典20题型,满满知识,看这一篇就够了(含答案)
  • 卷积神经网络CNN之ZF Net网络模型详解(理论篇)