"__attribute __((packed,aligned(4)))"是什么意思

Aar*_*Lee 116 c gcc

它是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;
Run Code Online (Sandbox Code Playgroud)

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

Jey*_*ram 144

在回答之前,我想向您提供一些来自Wiki的数据


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

当现代计算机读取或写入存储器地址时,它将以字大小的块(例如,32位系统上的4字节块)执行此操作.数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能.

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


gcc提供了避免结构填充的工具.即在某些情况下避免这种无意义的字节.考虑以下结构

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

}sSampleStruct;
Run Code Online (Sandbox Code Playgroud)

sizeof(sSampleStruct)因为结构填充,将是12而不是8.默认情况下,在X86中,结构将填充为4字节对齐.

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

}sSampleStruct;
Run Code Online (Sandbox Code Playgroud)

我们可以使用__attribute__((packed, aligned(X)))坚持特定(X)大小的填充.X应该是2的幂.请参考这里

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

}__attribute__((packed, aligned(1))) sSampleStruct;  
Run Code Online (Sandbox Code Playgroud)

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

如果您希望对所有结构执行相同操作,只需将对齐值推送到堆栈即可 #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

  • 如果内存以4字节块的形式存储数据,那么为什么它不向无符号短路(2字节长)添加2个填充字节?或编译器只是添加填充字节到结构的第一个和最后一个成员?你能澄清一下吗? (5认同)
  • @User Plz也提到了这一点.如果你仍然不清楚,请来帮助http://stackoverflow.com/questions/11772553/why-padding-is-not-happening-in-this-case (4认同)
  • @TanveerBadar,他们的意思是填充字节的*值*是没有意义的,而不是它们的存在。 (3认同)

cni*_*tar 81

  • packed意味着它将使用尽可能小的空间struct Ball- 即它将填充字段而不填充
  • aligned意味着每个都struct Ball将以4字节边界开始 - 即对于任何边界struct Ball,其地址可以除以4

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


Jul*_*ina 14

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

aligned(4) 表示结构应该与可被4整除的地址对齐.