/*
* 字节对齐:默认情况下,某个元素长度为n,它占用的开始地址就要从n的倍数开始 (地址从0x00开始)
* 需要注意的是:最后总长度需要是最长元素的整数倍,比如t3,最后一个int在0x24到0x27,但由于最长的double是8字节,所以0x28到0x31也被用于对齐
* char: 1
* short: 2
* int: 4
* double: 8
*
* 指定对齐长度时,按对齐长度对齐即可,如 #pragma pack(2) ,所有元素从0,2,4,6,8,10...开始即可
*/
struct t1 { // length: 16
char a;
short b;
int c;
double d;
};
struct t2 { // 24
char a;
short b;
char e;
int c;
// 以上占12字节,0x00 ~ 0x11
double d; // double 8字节,从8的倍数开始,即从16开始,0x12 ~ 0x15不用
};
struct t3 { // 32
char a; // 0x00 ~ 0x01
short b; // 0x02 ~ 0x03
int c; // 0x04 ~ 0x07
double d; // 0x08 ~ 0x15
char e[5]; // 0x16 ~ 0x23
int x; // 0x 24 ~ 0x27,但长度要为最长元素d的整数倍,所以额外添加0x28~0x31用于对齐
// int x2; // 再加一个int,将占用0x28~0x31,长度32不变
};