C 语言编程 — GCC Attribute 语法扩展
Posted 范桂飓
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言编程 — GCC Attribute 语法扩展相关的知识,希望对你有一定的参考价值。
目录
文章目录
- 目录
- Attribute 属性扩展机制
- `__attribute__((packed))`
- `__attribute__((aligned(n)))`
- `__attribute__((noreturn))`
- `__attribute__((unused))`
Attribute 属性扩展机制
GCC 的特点之一就是 Attribute 语法扩展机制,通过使用 __attribute__
关键字可以设置以下对象的扩展属性,它提供了一种灵活的方式来控制编译器的行为,可以用于优化代码、实现特定的功能或者调整内存布局等。
- 函数属性(Function Attribute):修饰某个函数。
- 变量属性(Variable Attribute):修饰某个变量。
- 类型属性(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将被标记为未被使用,从而避免编译器发出警告。
以上是关于C 语言编程 — GCC Attribute 语法扩展的主要内容,如果未能解决你的问题,请参考以下文章
Linux gcc支持的语法 __attribute__ 属性设置
GCC __attribute __((模式(XX))实际上做了什么?
GCC 的 __attribute__((__packed__)) 是不是保留原始顺序?
Visual C++ 是不是提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构?
c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?