关于calcsize()的有关问题
关于calcsize()的问题
现在有,长度分别是2,2,8
print calcsize('H') 2
print calcsize('h') 2
print calcsize('q') 8
可是当我calcsize('Hhq') 的时候长度变成了16
H+h+q=12
可是现在却等于16
不知道为什么
我看了python文档,好像和字符串有关,这个如果,没有q,H+h=4是正确的
请高手指点
------解决方案--------------------
现在有,长度分别是2,2,8
print calcsize('H') 2
print calcsize('h') 2
print calcsize('q') 8
可是当我calcsize('Hhq') 的时候长度变成了16
H+h+q=12
可是现在却等于16
不知道为什么
我看了python文档,好像和字符串有关,这个如果,没有q,H+h=4是正确的
请高手指点
------解决方案--------------------
- Python code
#!/usr/bin/python #Filename:i import struct print struct.calcsize('Hhq') print struct.calcsize('H') print struct.calcsize('h') print struct.calcsize('q')
------解决方案--------------------
struct.caclsize的文档:
Return the size of the struct (and hence of the string) corresponding to the given format.
返回的是C语言中结构占的内存大小.
每个字符代表什么类型就不再粘贴了.
这个返回楼主所看到的结果是和编译器有关系的.
可以看看<C语言程序设计-现代方法>一书中关于结构的讲述.
有些计算机会要求数据项从某个数量字节(一般是4字节)的倍数开始, 因此, 为了满足计算机的要求, 往往通过在邻近的成员之间留”空洞”的方法, 编译器会把结构的成员”排列”起来, 如果假设数据项必须从4个字节的倍数开始, 那么结构的字符型等较短类型的成员将会跟着几个空字节, 导致整个结构的sizeof()函数运算结果偏大. 这个空洞即可以留到结构的中间, 也可以留到结构的后面.
注意: 这种留空只会发生在两种不同数据类型之间, 比如, 如果是两个连续的char, 并不会导致留空….但是, 结构最后的成员不能满足长度时, 一定会留空
我做的试验:
qh: 10
qq: 16
qhq: 24
hh: 4
fh: 6
根据我的测试结果, 我能得到的结论是:
在我的电脑环境下(Intel处理器, windows系统, python25)或者是python自身规则是:
处理数据的单位是8字节, 也就是说为成员分配内存时以8的倍数开始, 除非正在分配的成员能够在当前的8个字节内分配到完整的内存空间..
------解决方案--------------------
楼主不要被我上面说的C语言中结构的那段弄迷惑了, 这个东西, 一个地方一个规则, 只要知道它是怎么回事就好了, 然后去发现新的环境下的新规则, 完成自己的工作就好.
------解决方案--------------------
c/c++里所谓字节对齐问题。留空是为了增快存取速度,所以代码的逻辑或运算不要依赖结构本身大小...
------解决方案--------------------