内存对齐:
假定从0字节排列结构的第一个成员,之后所有成员的起始字节数,必须是成员本身字节数的整数倍,如果不是则填充一些空闲字节。
#include <stdio.h> typedef struct Data { char ch; // 0 // 1 2 3 空闲了3个字节用于内存对齐 int num; // 4 5 6 7 }Data; int main(int argc,const char* argv[]) { Data d; printf("%p %p\n",&d.ch,&d.num); // 这个地址之间距离是4字节,ch占用了1字节,所以空了3个字节 printf("%d\n",sizeof(d)); }
内存补齐:
结构的总字节数必须是它最大成员字节数的整数倍,如果不是则在结构的末尾填充一些空闲字节。
typedef struct Data { char ch; // 0 // 1 2 3 int num; // 4 5 6 7 short sh; // 8 9 目前为止使结构体总字节数是10字节,最大成员是4字节,10不是4的整数倍,所以在末尾填充2字节 // 10 11 }Data int main(int argc,const char* argv[]) { Data d; printf("%p %p\n",&d,&d.sh); printf("%d\n",sizeof(d)); }
注意:
在32位系统下,内存对齐、内存补齐字节数是有上限的,超过上限按4字节计算。
// 在Linux32位系统下,超过4字节按4字节计算。 typedef struct Data { char ch; // 0 // 1 2 3 double num; // 4 ~ 11 short sh; // 12 13 // 14 15 }Data; int main(int argc,const char* argv[]) { printf("%d\n",sizeof(Data)); // 结果是16字节 } #include <stdio.h> // 在Windows32位系统下,超过8字节按4字节计算。 typedef struct Data { char ch; // 0 // 1 2 3 long double num; // 4 ~ 15 short sh; // 16 17 // 18 19 }Data; int main(int argc,const char* argv[]) { printf("%d\n",sizeof(Data)); // 结果是20字节 }#include <stdio.h> // 在Windows32位系统下,未超过8字节,按成员的实际字节对齐补齐 typedef struct Data { char ch; // 0 // 1 2 3 4 5 6 7 double num; // 8 ~ 15 short sh; // 16 17 // 18 19 20 21 22 23 }Data; int main(int argc,const char* argv[]) { printf("%d\n",sizeof(Data)); // 结果是24字节 }#include <stdio.h> // Windows64位系统和Linux64位系统,都按成员的字节数计算内存对齐、内存补齐 typedef struct Data { char ch; // 0 // 1 2 3 4 5 6 7 8 9 11 12 13 14 15 long double num; // 16 ~ 31 short sh; // 32 33 // 34 35 36 37 38 39 40 41 42 42 44 45 46 47 }Data; int main(int argc,const char* argv[]) { printf("%d\n",sizeof(Data)); }
long类型的字节数:
Linux32位系统 4字节
Linux64位系统 8字节
Windows32位系统 4字节
Windows64位系统 4字节