>>>import struct
>>>size_a = struct.calcsize('10s')
size_a = 10
>>>size_b = struct.calcsize('iii')
size_b = 12
>>>size_c = struct.calcsize('10siii')
size_c = 24
有人可以告诉我为什么size_c是24
而不是22
(10 + 12)?
答案 0 :(得分:14)
这与alignment有关。任何特定类型(字节,整数, 等)只能从其标准尺寸的倍数的偏移开始。
字节字符串s
可以从任何偏移处开始,因为其标准大小为1.
但是32位整数i
只能以4的倍数偏移量开始
(它的大小)。例如,0,4,8,12等
因此,要分析结构10siii
,首先要解析10字节字符串。
Offset: 0 1 2 3 4 5 6 7 8 9
s----------------->
10s
占用了预期的前10个字节。现在
以下3个整数。
1 1 1 1 1 1 1 1 1 1 2 2 2 2
Offset: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
s-----------------> x x i-----> i-----> i----->
每个整数跨越4个字节,但每个整数只能以a的偏移量开始 4的倍数(即8,12,16,20,而不是10)。由于起始字节串占用10个字节,因此必须如此 填充2个字节以允许整数处于适当的偏移量。因此,您最终得到的结构总大小包括:10(开始字节字符串)+ 2(填充)+ 12(3个整数)= 24字节结构。