__attribute__

问题描述 投票:0回答:3

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

__attribute__

function gcc declaration
3个回答
45
投票

GCC 和 GCC 兼容编译器使用什么

__attribute__
大多数其他编译器使用
#pragma
指令。

我认为 GCC 的解决方案更好,因为无法识别的

#pragma
所需的行为是忽略它,而如果您使用不理解
__attribute__
规范的编译器,它将无法编译 - 这通常更好,因为您然后知道您需要移植什么。

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


37
投票

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

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

将确保

vect
将被放置在16字节内存边界上。我不知道这是海湾合作委员会主义还是更普遍适用。

编译器通常只会在 4 字节边界上对齐

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

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


-14
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.