为什么和如何在GNU C程序中使用__attribute__
?
对于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程序中使用它?请参阅其他回答来解决这个问题。
__attribute__
,所以我偶然发现了这个问题。我仍在努力学习C语言的新知识以及不同编译器实现之间的差异。我现在觉得属性是新的、有趣的和值得注意的。将来我很乐意使用它们提供的功能。也许,在阅读了这个答案后,我会三思而后行(如果我关心可移植性的话,有时可能不关心)。 - Ole Thomsen Buus