在回答之前,我想给你一些来自维基的数据
数据结构对齐是在计算机内存中排列和访问数据的方式。它包含两个独立但相关的问题:数据对齐和数据结构填充。
当现代计算机从内存地址读取或写入内存地址时,它将以字大小的块(例如,在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)