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