“__ tribute__ ((打包,对齐(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;

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

217702 次浏览
  • packed意味着它将为 struct Ball使用尽可能小的空间——也就是说,它将不用填充而将字段塞在一起
  • aligned意味着每个 struct Ball将以一个4字节的边界开始——也就是说,对于任何 struct Ball,它的地址都可以被4除

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

属性 packed意味着编译器不会在 struct的字段之间添加空白。填充通常用于使字段与其自然大小对齐,因为有些体系结构会对不对齐的访问施加惩罚,或者根本不允许这样做。

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

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


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

当一台现代计算机读取或写入内存地址时,它会以字大小的块(例如32位系统上的4字节块)来完成。< em > 数据对齐 意味着将数据放在相当于字大小的某个倍数的内存偏移处,这样可以由于 CPU 处理内存的方式而提高系统的性能。

为了对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开始(< em > 数据结构填充 )之间插入一些无意义的字节。


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 属性不允许结构填充。

如果您希望对所有结构执行相同的操作,那么只需使用 #pragma将对齐值推入堆栈即可

#pragma pack(push, 1)


//Structure 1
......


//Structure 2
......


#pragma pack(pop)