“__attribute __((packed,align(4)))”是什么意思?

它是C语言。它写道:

typedef struct __attribute__((packed, aligned(4))) Ball { float2 delta; float2 position; //float3 color; float size; //int arcID; //float arcStr; } Ball_t; Ball_t *balls; 

请告诉我它是什么意思,以及如何使用这个关键字。

在回答之前,我想给你一些来自Wiki的数据


数据结构alignment是数据在计算机内存中的排列和访问方式。 它由两个独立但相关的问题组成: 数据alignment数据结构填充

当现代计算机读取或写入内存地址时,它将以字大小的块(例如,32位系统上的4字节块)执行此操作。 数据alignment意味着将数据置于等于字长的几倍的存储器偏移处,由于CPU处理内存的方式而增加了系统的性能。

要alignment数据,可能需要在最后一个数据结构的末尾和下一个数据结构填充的开始之间插入一些无意义的字节。


gcc提供了避免结构填充的function。 ie在某些情况下避免这个毫无意义的字节。 考虑以下结构

 typedef struct { char Data1; int Data2; unsigned short Data3; char Data4; }sSampleStruct; 

sizeof(sSampleStruct)将是12而不是8.由于结构填充。 默认情况下,在X86中,结构将被填充为4字节alignment。

 typedef struct { char Data1; //3-Bytes Added here. int Data2; unsigned short Data3; char Data4; //1-byte Added here. }sSampleStruct; 

我们可以使用__attribute__((packed, aligned(X)))来坚持特定的(X)大小的填充。 X应该是两个的权力。 请参阅这里

 typedef struct { char Data1; int Data2; unsigned short Data3; char Data4; }__attribute__((packed, aligned(1))) sSampleStruct; 

所以上面指定的gcc属性不允许结构填充。 所以大小将是8个字节。

如果你希望对所有的结构都做同样的事情,我们可以使用#pragma将alignment值推送到堆栈

 #pragma pack(push, 1) //Structure 1 ...... //Structure 2 ...... #pragma pack(pop) 
  • packed意味着它将使用struct Ball的最小可能空间 – 即它将填充字段而不填充
  • aligned意味着每个struct Ball将从一个4字节的边界开始 – 即对于任何struct Ball ,其地址可以除以4

这些是GCC扩展,不是任何C标准的一部分。

packed的属性意味着编译器不会在struct字段之间添加填充。 填充通常用于使字段与其自然大小alignment,因为一些体系结构会对未alignment的访问进行处罚,或者根本不允许使用它。

aligned(4)表示结构应该alignment到一个可以被4整除的地址。