原则二:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。
s3的大小是12字节
int i1占第1-4字节
char c2占第5字节
short s1占第7-8字节 (short以2个字节为单位进行存储,由于第5字节已有数据,因此它会存入下一个2字节模块,也就是存入到7~8字节)
char c2占第9字节
最宽的int的长度是4 补齐为4的整倍数就是12字节
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
补齐说明如下:
s1中,第一个元素是int,大小是4,且4是最大的类型,结构体的最后大小肯定是4的倍数。
第二个是short,大小是2,是2的倍数,暂不补齐
第三个元素和第四个元素大小和正好是2,与第2个元素一起正好是4,所以不再需要补齐。
所以s1大小是8
s2中,第一个元素是int,大小是4,且4是最大的类型,结构体的最后大小肯定是4的倍数。
第二、三个元素都是char,大小是2,满足2的倍数,暂不补齐
第四个元素大小是2,与第二、三个元素大小和正好是4,所以结构体不再需要补齐。
所以s2大小是8
s3中,第一个元素是int,大小是4,且4是最大的类型,结构体的最后大小肯定是4的倍数。
第二个元素是char,大小是1,暂补不起
第三个元素是short,大小是2,第二、三个元素和大小是3,不是2的倍数,需要补齐,
因为第三个元素大小是2的倍数,所以补齐第二个元素的大小,也就是第二个元素后增加1个char,
至此,结构体元素大小是4+1+1(补齐位)+2=8
第四个元素是char,大小是1,不是4的倍数,且是最后一个元素,所以第四个元素后面补齐3位
所以s3的大小是4+1+1(补齐位)+2+1+3(补齐位)=12
结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
结构体对齐是按每个成员变量算的,并非仅仅是按整体占用的空间大小再来对齐,为的是每个成员寻址、取值、写值更快。
如果是4字节对齐,那么,每个成员的地址应该是4的倍数,地址是像这样0x0, 0x4, 0x8, 0xC, ...。虽然char通常只占1byte,但是同样会耗费4byte地址空间,因为像0x1,0x9这样的地址,不便于寻址。
在严格要求对齐的情形中,不应该直接用int,char,short这样的类型,而应该用uint32_t, uint8_t, uint16_t(有符号类型是int32_t, int8_t, int16_t),因为不同机器中,int、char、short占用字节数不确定。
1.
int short char char
4 2 1 1
2.
int char char short
4 1 1 2
3.
int char short char
4 2 2 4
3的第三个是short占2字节,前面是5字节,要补到
2字节的倍数,所以第二个占了2字节。