标签: python python-3.x struct memory-alignment
我已经在Wikipedia中阅读了一些有关处理器对齐的堆栈溢出问题,并在这里做了一些解答,但是我不了解一件事:
如果32位处理器以4字节为增量对齐,为什么struct.pack('BH', 1, 2)在中间添加一个空字节?
struct.pack('BH', 1, 2)
该short不会在可被4整除的地址上边界(只能被2整除),并且当处理器读取一个字时,无论short是在中间还是在末尾,它都会读取所有4个字节
它也没有为更多数据做准备,因为另一个字节可以在地址3-4中加入并且不占用额外空间,而恰好是1字节对齐。
答案 0 :(得分:0)
默认情况下,struct使用平台C编译器正在使用的约定。您可以告诉struct不要使用padding
有关常规对齐方式的说明,请参见this。
在x86或ARM处理器上存储基本C数据类型的操作通常不会从内存中的任意字节地址开始。相反,除char以外的每种类型都有对齐要求; chars可以从任何字节地址开始,但是2字节短裤必须从偶数地址开始,4字节int或float必须在被4整除的地址上开始,而8字节长或双精度数必须在被8整除的地址上开始。有符号或无符号都没关系。