#pragma pack
什么是内存对齐?
不同类型的数据在内存中按照一定的规则排列
而不一定是顺序的一个接一个的排列
struct Test1
{
char c1;
short s;
char c2;
int i;
};
struct Test2
{
char c1;
char c2;
short s;
int i;
};
printf("sizeof(struct Test1)",sizeof(struct Test1));
printf("sizeof(struct Test2)",sizeof(struct Test2));
输出结果为:
sizeof(struct Test1) : 12
sizeof(struct Test2):8
为什么需要内存对齐?
cpu对内存的读取不是连续的,而是分成块读取的,块的大小只能是1,2,4,8,16...字节
当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣
某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则产生硬件异常
#pragma pack 能够改变编译器默认的内存对齐方式
struct 占用的内存大小
第一个成员起始于0偏移处
每个成员按其类型大小和pack参数中较小的一个进行对齐
偏移地址必须能被对齐参数整除
结构体成员的大小取其内部长度最大的数据成员作为其大小
结构体总长度必须为所有对齐参数的整数倍
编译器在默认情况下按照4字节对齐
结构体的大小取数据成员中最大的那个值作为结构体的大小
gcc 编译器 不支持8字节对齐