1.结构体内存对齐规则
eg1:
struct X { char a; int b; double c; }S1; int main() { cout<<sizeof(S1)<<endl; cout<<sizeof(S1.a)<<endl; cout<<sizeof(S1.b)<<endl; cout<<sizeof(S1.c)<<endl; return 0; }
原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)
eg2:
struct X { char a; double c; int b; }S1; int main() { cout<<sizeof(S1)<<endl; cout<<sizeof(S1.a)<<endl; cout<<sizeof(S1.b)<<endl; cout<<sizeof(S1.c)<<endl; return 0; }
原则二:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍
eg3:
struct X { double c; char a; int b; }S1; int main() { cout<<sizeof(S1)<<endl; cout<<sizeof(S1.a)<<endl; cout<<sizeof(S1.b)<<endl; cout<<sizeof(S1.c)<<endl; return 0; }
eg4:
struct X { double c; char a; int b; char d; }S1;
eg5:
struct X { double c; char a; int b; char d; int e; }S1;
eg6:
struct X { int e; double c; char a; int b; char d; }S1;
***前面所介绍的都是元素为基本数据类型的结构体,那么含有指针、数组或是其它结构体变量或联合体变量时该如何呢?
包含指针类型的情况。只要记住指针本身所占的存储空间是4个字节就行了,而不必看它是指向什么类型的指针
eg7:
struct X { char a; int b; double c; }; struct Y { char d; X b; };
如果将Y的两个元素char型的a和X型的b调换定义顺序,则系统为b分配的存储位置是第0~15个字节,为a分配的是第16个字节,加起来一共17个字节,不是最长基本类型double所占宽度8的整数倍,因此要补齐到8的整数倍,即24。测试后可得sizeof(Y)的值为24