我已经在维基百科上读到了关于处理器对齐的堆栈溢出的一些答案,但有一件事我不明白:
如果32位处理器对齐到4字节的增量,为什么struct.pack('BH', 1, 2)会在中间添加一个空字节?
短地址不会被4整除(只能被2整除),当处理器将读取一个字时,它将读取所有4个字节,无论短是在中间还是在结尾。
它也不会为更多的数据做好准备,因为另一个字节可以加入地址3-4,并且不占用额外的空间,同时完全对齐1个字节。
发布于 2019-02-04 19:26:09
默认情况下,struct使用平台C编译器使用的约定。您可以告诉结构不使用padding
有关通常的对齐方式的解释,请参阅this。
在x86或ARM处理器上,基本C数据类型的
存储通常不会从内存中的任意字节地址开始。相反,除字符之外的每种类型都有对齐要求;字符可以从任何字节的地址开始,但2字节的短整型必须从偶数地址开始,4字节的整型或浮点型必须从可被4整除的地址开始,8字节的长整型或双精度型必须从可被8整除的地址开始。有符号或无符号没有区别。
https://stackoverflow.com/questions/54514287
复制相似问题