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

Posted 范桂飓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言编程 — GCC Attribute 语法扩展相关的知识,希望对你有一定的参考价值。

目录

文章目录

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将被标记为未被使用,从而避免编译器发出警告。

以上是关于C 语言编程 — GCC Attribute 语法扩展的主要内容,如果未能解决你的问题,请参考以下文章

Linux gcc支持的语法 __attribute__ 属性设置

GCC __attribute __((模式(XX))实际上做了什么?

GCC 的 __attribute__((__packed__)) 是不是保留原始顺序?

gcc之__attribute__简介及对齐参数介绍

Visual C++ 是不是提供与 GCC 中的 `__attribute__((alias))` 功能相同的语言结构?

c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?