GNU C中的__attribute__

sud*_*03r 50 gcc declaration function

为什么以及如何 __attribute__在GNU C程序中使用?

qrd*_*rdl 38

GCC属性:

  • 虽然这些链接很有用,但这个答案本身并不能提供任何信息. (31认同)

Cli*_*ord 27

对于GCC和GCC兼容的编译器使用的__attribute__大多数其他编译器使用#pragma指令.

我认为GCC的解决方案更好,因为无法识别的所需行为#pragma是忽略它,而如果你使用不理解__attribute__规范的编译器,它将无法编译 - 这通常更好,因为你随后知道你需要端口.

属性规范用于指定类型,数据和功能的方面,例如无法使用C指定的存储和对齐.通常这些是特定于目标的,主要是它们不可移植,当然在编译器之间,通常在目标之间.除非对代码的正确功能有绝对必要,否则请避免使用它们.


Geo*_*ips 19

一种用途是在变量和结构成员上强制执行内存对齐.例如

float vect[4] __attribute__((aligned(16)));
Run Code Online (Sandbox Code Playgroud)

将确保vect将放置在16字节的内存边界上.我不知道这是gcc-ism还是更普遍适用.

编译器通常仅vect在4字节边界上对齐.通过16字节对齐,它可以直接与SIMD加载指令一起使用,您可以将其加载到128位寄存器中,这些寄存器允许加法,减法,点积和各种矢量运算.

有时您需要对齐,以便结构可以直接覆盖到内存映射的硬件寄存器上.或者它必须对齐,以便硬件可以直接写入它直接使用直接内存访问(DMA)机制.