77

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

4

3 回答 3

37

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

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

属性规范用于指定类型、数据和函数的各个方面,例如使用 C 无法指定的存储和对齐。这些通常是特定于目标的,大多数它们是不可移植的,当然在编译器之间,并且通常在目标之间。避免使用它们,除非绝对需要使用正确的代码功能。

于 2009-09-22T12:26:18.020 回答
26

一种用途是强制对变量和结构成员进行内存对齐。例如

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

将确保vect将放置在 16 字节的内存边界上。我不知道这是否是 gcc 主义或更普遍适用。

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

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

于 2009-09-22T07:24:04.443 回答
-10

为什么在 C 程序中使用它?限制它们的便携性。

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

编辑:为什么在 GNU C 程序中使用它?请参阅解决此问题的其他答案。

于 2009-09-22T08:26:23.710 回答