struct mystc
{
char a;
int b;
short c;
}
这样的一个结构体多大?反正不是1+4+2字节。
在内存中,结构体内的元素分布不是紧挨着依次排布的,而是存在着“内存对齐”
因为硬件原因,读取内存要按照一定的偏移量来存储,那么存储数据也相应按照一定的偏移量存储,也就是相应元素类型的长度。
所以在内存中,每个元素都“以为”内存中“全是自己”,所以元素的存储地址值一定是自身长度的整数倍;
所以在内存中,结构体mystr差不多长这样:
为什么最后还要占有两个空字节?
因为要为接下来的内存分配考虑,接下来的元素也需要对齐啊。
总结下来结构体内存分配的规律:
- 每个元素地址需是自身类型长度的整数倍
- 结构体本身所占内存大小需是结构体中最长类型长度的整数倍
并且,如果将上面的结构体元素重新排列下,例如这样:
struct mystr
{
char a;
short c;
int b;
}
这样,算一算结构体变得多大?
对,变成了8个字节,少了两个字节啊!!
所以在声明结构体时,尽量注意:
将较短类型放在前边,较长类型置后