C中结构体的内存规则并不是直接其属性的内存直接相加的,而是有一定规则的,也就是内存对齐规则;
一:结构体中第一个成员的偏移量是0,以后每个成员的位置是x的倍数;//x是各个属性的内存大小
二:成员对齐后,结构体自身也要对齐,按照y的倍数进行;//y是内存最大的属性的内存
比如:
struct m1{
char a;
int c;
double d;
}m1;
cout << sizeof(char) << " " << sizeof(int) << " " << sizeof(double) << endl;
//结果是1 4 8;
可是cout << sizeof(m1)//结果是16
再比如struct m2{
int c;
double d;
char a;
}m2;
cout << sizeof(m2);//结果是24
可以看到结构体的内存大小并不一定等于其属性的内存大小的和,就算属性相同先后次序不同,其结构体大小也可能会不同,这就是因为内存对齐这一机制。
结构体m1中a占1个字节,假设从地址0开始,则c本来会从地址1开始,可是c占4个字节,起始地址不是4的倍数,内存就会把起始地址往后移,也就是说移到地址4后,是4的倍数了,才开始存储c,同理d也是如此;
结构体m2中c占4个字节,假设地址也从0开始,则d会从4开始,可是4不是8的倍数,则移到8开始到地址15,然后a从16开始到地址17,但是17不是结构体属性中最大的属性double内存大小的倍数,所以加到24.