为什么打印出来的长度不一样呢??

2015-08-27 14:30:38 +08:00
 hnsxyhh
import struct

s = struct.Struct ('Is')
s1 = struct.Struct ('sI')

print ("s.size:",s.size )
print ("s1.size:",s1.size )

################
运行结果:
s.size: 5
s1.size: 8
2454 次点击
所在节点    Python
4 条回复
wartime
2015-08-27 14:44:49 +08:00
int 类型在内存中存放地址 4 字节对齐, 导致 s1 占了额外空间.

s.pack (1, 'a')
'\x01\x00\x00\x00a'

s1.pack ('a', 1 )
'a\x00\x00\x00\x01\x00\x00\x00'

可以看到内存中实际存放方式
hnsxyhh
2015-08-27 17:31:14 +08:00
@wartime 为什么 s1 有对齐, s 没有对齐啊
exch4nge
2015-08-27 17:34:54 +08:00
@hnsxyhh 可以去了解了解 C/C++的结构体对齐,就大概知道为啥 python 这个也要对齐了
wartime
2015-08-27 23:20:04 +08:00
@hnsxyhh s 的起始地址是四字节对齐的,首先存放 int 类型值,就不需要再偏移, s1 里起始地址存放的是一个 char 类型,占用一个字节,假设是 s1 起始地址是 0x1000, int 存放地址就是从 0x1001 开始,没有对齐, 只有再偏移三个字节, 到 0x1004, 才能四字节对齐。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/216387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX