为什么short是2字节对齐的?

时间:2014-04-12 06:46:58

标签: c alignment

这是一个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,英特尔

1 个答案:

答案 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字节边界的末尾。