C语言中字节对其有两种方式:
1、通过预处理命令
#pragma pack(n),指定按照n字节对齐;
#pragma pack(),取消自定义的对齐值;
例如:
#pragma pack(2)
struct A
{
char c; //第一个成员,自身长1,#pragma pack(2),取较小值,按照1字节对齐,放在[0]偏移的位置;
int i; //第二个成员,自身长4,#pragma pack(2),取较小值,按照2字节对齐,放在[2,5]偏移的位置;
};
struct B
{
char c1; //第一个成员,自身长1,#pragma pack(2),取较小值,按照1字节对齐,放在[0]偏移的位置;
A s; //第二个成员,自身长6,#pragma pack(2),取较小值,按照2字节对齐,放在[2,7]偏移的位置;
char c2; //第三个成员,自身长1,#pragma pack(2),取较小值,按照1字节对齐,存放在[8]偏移的位置;
};
#pragma pack()
2、__attribute__((packed)):取消结构体在编译过程中的优化对齐,按照实际占用字节数进行对齐,等价于指令#pragma pack(1),即,按照1字节对齐;
备注:对于内存对齐,CPU的优化规则大致原则是这样的:对于n字节的元素(n=2,4,8,...),它的首地址能被n整除时,才能获得最好的性能;