GNU C 中的 __attribute__

89

为什么和如何在GNU C程序中使用__attribute__

3个回答

44

对于GCC和兼容GCC的编译器,它们最常使用__attribute__,而其他大部分编译器则使用#pragma指令。

我认为GCC的解决方案更好,因为未被识别的#pragma应该忽略它,而如果您使用不理解__attribute__规范的编译器,则不会编译——通常这是更好的,因为您知道需要移植什么。

属性规范用于指定类型、数据和函数的存储和对齐等方面,这些无法使用C语言来指定。通常这些规范是针对特定目标的,大多数情况下它们是不可移植的,尤其是在不同的编译器和目标之间。除非必须使用正确的代码函数,否则请避免使用它们。


36

其中一个用途是强制内存对齐变量和结构体成员。例如:

float vect[4] __attribute__((aligned(16)));

这将确保vect被放置在16字节的内存边界上。我不知道这是否只适用于gcc,还是更普遍适用。

编译器通常只会将vect对齐到4字节边界。通过16字节对齐,它可以直接与SIMD加载指令一起使用,其中您可以将其加载到128位寄存器中,从而允许加法、减法、点积和各种向量运算。

有时,您需要对齐以便将结构体直接叠加到内存映射硬件寄存器上。或者必须对齐,以便硬件可以直接使用直接存储访问(DMA)机制将数据写入其中。


-15

为什么在C程序中使用它? 为了限制它们的可移植性。

它以双下划线开头,因此它位于实现者的命名空间中 - 它不是语言标准定义的内容,每个编译器供应商都可以自由地将其用于任何目的。

编辑:为什么在GNU C程序中使用它?请参阅其他回答来解决这个问题。


14
嗯,我认为它并不是专门用于阻止携带便携性。 - GManNickG
9
MLP,那不是你说的。你说过,“它被用于C程序中来限制它们的可移植性。”这是完全错误的。 - GManNickG
7
不,严格来说是错误的。它绝不会用于限制可移植性;由此产生的可移植性限制是由其他因素引起的,但从未使用它以限制可移植性。这是一个微妙但非常重要的区别。 - Alice
4
即使使用属性限制可移植性,这也并不意味着属性被用于或存在于限制可移植性的目的。副作用不一定是预期效果。 - Alice
5
因为我在简短地研究了upstart的C源代码后(出于可耻的原因),也查询了__attribute__,所以我偶然发现了这个问题。我仍在努力学习C语言的新知识以及不同编译器实现之间的差异。我现在觉得属性是新的、有趣的和值得注意的。将来我很乐意使用它们提供的功能。也许,在阅读了这个答案后,我会三思而后行(如果我关心可移植性的话,有时可能不关心)。 - Ole Thomsen Buus
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接