Cli*_*ord 27
对于GCC和GCC兼容的编译器使用的__attribute__大多数其他编译器使用#pragma指令.
我认为GCC的解决方案更好,因为无法识别的所需行为#pragma是忽略它,而如果你使用不理解__attribute__规范的编译器,它将无法编译 - 这通常更好,因为你随后知道你需要端口.
属性规范用于指定类型,数据和功能的方面,例如无法使用C指定的存储和对齐.通常这些是特定于目标的,主要是它们不可移植,当然在编译器之间,通常在目标之间.除非对代码的正确功能有绝对必要,否则请避免使用它们.
Geo*_*ips 19
一种用途是在变量和结构成员上强制执行内存对齐.例如
float vect[4] __attribute__((aligned(16)));
Run Code Online (Sandbox Code Playgroud)
将确保vect将放置在16字节的内存边界上.我不知道这是gcc-ism还是更普遍适用.
编译器通常仅vect在4字节边界上对齐.通过16字节对齐,它可以直接与SIMD加载指令一起使用,您可以将其加载到128位寄存器中,这些寄存器允许加法,减法,点积和各种矢量运算.
有时您需要对齐,以便结构可以直接覆盖到内存映射的硬件寄存器上.或者它必须对齐,以便硬件可以直接写入它直接使用直接内存访问(DMA)机制.