struct内存对齐遵循以下两条原则:
1, 结构体中成员变量的内存地址相对于结构体首地址的偏移量,是其自身长度的整数倍。
2, 结构体变量的整体长度是其中最长成员变量长度的整数倍。
struct data{
char a;
short b;
int c;
char d;
};
64位cpu中,该结构体在内存中的分布如下:
地址: 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
数据: |d| |-补充字节 ---|
占用单元数: 1 3
地址:0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 (共8个字节)
数据:|a| |---| |--- b --| |------- c -------------|
占用单元数: 1 2 4
该结构体共占用12个字节。
#include <stdio.h>
void main()
{
typedef struct data{
char a;
short b;
int c;
char d;
}DATA;
DATA data;
printf("%x,%x,%x,%x\n",&data.a,&data.b,&data.c,&data.d );
printf("sizeof(data) is %d\n",sizeof(data));
}
输出:
1ff9e0,1ff9e2,1ff9e4,1ff9e8
sizeof(data) is 12