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


122

它是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;

请告诉我它的含义以及如何使用此关键字。


4
这是一个“类型属性” ..(我在Google中发现它带有“ C属性压缩”。当然其他人至少可以做得很好!)

1
看到这个问题 -尽管aligned(4)您可能不必担心太多。
基思·汤普森

Answers:


157

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


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

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

为了对齐数据,可能有必要在最后一个数据结构的末尾与下一个数据结构的末尾(即数据结构padding)之间插入一些无意义的字节。


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应该是2的幂。请参考这里

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)

6
如果内存以4个字节的块存储数据,那么为什么不将2个填充字节添加到无符号的short(2个字节长)呢?还是编译器只是将填充字节添加到结构的第一个和最后一个成员?能否请您澄清一下。
用户

5
@User Plz也可以参考。如果你还不清楚,PLZ来帮忙stackoverflow.com/questions/11772553/...
Jeyaram

谁说这些填充字节毫无意义,谁都不知道未对齐的数据访问是x86体系结构的怪癖。当处理器试图加载跨越其自然对齐边界的数据(例如整数)时,这些字节是避免异常所必需的。
Tanveer Badar

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

这些是GCC扩展,不属于任何C标准。


17

该属性packed表示编译器不会在的字段之间添加填充struct。填充通常用于使字段与它们的自然大小对齐,因为某些架构会对未对齐的访问施加惩罚或完全不允许这样做。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.