“__attribute __((packed,aligned(4)))”的含义是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

它是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的数据

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

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

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

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

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

}sSampleStruct;

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;

我们可以__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

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

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

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

扫码关注云+社区

领取腾讯云代金券