这是一个C结构的声明:
struct align
{
char c; //1 byte
short s;//2 bytes
};
在我的环境中,sizeof(struct align)为4,填充1字节位于' char c'和'短s'。有人说这是因为“短”'必须是2字节对齐,所以在#c; c c ##之后插入1个字节。在32位机器上,我知道' int'最好是4字节对齐以防止2个存储器读周期,因为在CPU和存储器之间的地址总线上发送的地址是4的倍数。但是“短”'是2个字节,小于4个字节,因此它的地址可以是4字节单元内的任何字节(最后一个字节除外)。
4个地址的倍数 - > | 0 | 1 | 2 | 3 |
我的意思是,'简短'可以从0,1或2开始。所有都可以通过1个读取周期检索,不需要0或2.在我的结构对齐'案例,' char c'可能是0,'短s'可能是1-2,填充可能是3。
为什么2字节长"短"必须是2字节对齐?
由于
更新我的环境: gcc版本4.4.7,i686,英特尔
答案 0 :(得分:4)
这是因为从机器的角度来看,struct
的成员与该类型的单个变量没有区别。无论您选择哪种对齐方式,它都适用于两者。
例如,如果short
为两个字节长,
struct align
{
char c;
short s; // two-byte word
};
short ss; // two-byte word
成员s
是2字节类型(例如IA32中的WORD ),与#34;独立"完全相同。变量ss
。底层架构将它们视为相同。因此,当涉及该类型的对齐要求时,它只适用于两者。
如果在数据末尾添加填充,则可能仍未对齐。考虑ss
的开头位于4字节边界的末尾。