为什么以及如何 __attribute__
在 GNU C 程序中使用?
3 回答
对于 GCC 和兼容 GCC 的编译器,__attribute__
大多数其他编译器使用#pragma
指令。
我认为 GCC 的解决方案更好,因为无法识别的所需行为#pragma
是忽略它,而如果您使用不理解__attribute__
规范的编译器,它将无法编译 - 这通常会更好,因为您知道需要移植什么.
属性规范用于指定类型、数据和函数的各个方面,例如使用 C 无法指定的存储和对齐。这些通常是特定于目标的,大多数它们是不可移植的,当然在编译器之间,并且通常在目标之间。避免使用它们,除非绝对需要使用正确的代码功能。
一种用途是强制对变量和结构成员进行内存对齐。例如
float vect[4] __attribute__((aligned(16)));
将确保vect
将放置在 16 字节的内存边界上。我不知道这是否是 gcc 主义或更普遍适用。
编译器通常只会vect
在 4 字节边界上对齐。通过 16 字节对齐,它可以直接与 SIMD 加载指令一起使用,您可以将其加载到 128 位寄存器中,该寄存器允许加法、减法、点积和各种向量操作。
有时您需要对齐,以便可以将结构直接覆盖到内存映射的硬件寄存器上。或者它必须对齐,以便硬件可以使用直接内存访问 (DMA) 机制直接写入它。
为什么在 C 程序中使用它?限制它们的便携性。
它以双下划线开头,因此它位于实现者的命名空间中——它不是由语言标准定义的,每个编译器供应商都可以出于任何目的自由使用它。
编辑:为什么在 GNU C 程序中使用它?请参阅解决此问题的其他答案。