数据结构对齐是数据在计算机内存中排列和访问的方式。它由两个独立但相关的问题组成:数据对齐和数据结构填充。
当现代计算机读取或写入内存地址时,它将以字大小的块(例如 32 位系统上的 4 字节块)执行此操作。数据对齐意味着将数据放置在等于字大小的某个倍数的内存偏移处,由于 CPU 处理内存的方式,这会提高系统的性能。
为了对齐数据,可能需要在最后一个数据结构的结尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充。
gcc 提供了禁用结构填充的功能。即在某些情况下避免这些无意义的字节。考虑以下结构:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}SampleStruct_t;
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.
}SampleStruct_t;
我们可以使用__attribute__((packed, aligned(X)))
坚持特定(X)
大小的填充。X 应该是 2 的幂。
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) SampleStruct_t;
所以上面指定的 gcc 属性不允许结构填充。所以大小将是 8 个字节。
如果您希望对所有结构做同样的事情,我们可以简单地将对齐值推送到堆栈使用#pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)