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

pas*_*636 5 c alignment

这是一个C结构的声明:

struct align
{
    char c; //1 byte
    short s;//2 bytes
};
Run Code Online (Sandbox Code Playgroud)

在我的环境中,sizeof(struct align)为4,填充1字节位于'char c'和'short s'之间.有人说这是因为"short"必须是2字节对齐,所以pading 1字节在'char c'之后.在32位机器上,我知道'int'最好是4字节对齐,以防止2个存储器读周期,因为在CPU和存储器之间的地址总线上发送的地址是4的倍数.但是'short'是2个字节,这个更少超过4个字节,因此其地址可以是4字节单元内的任何字节(最后一个字节除外).

4个地址的倍数 - > | 0 | 1 | 2 | 3 |

我的意思是,'short'可以从0,1或2开始.所有都可以通过1个读取周期检索,不必为0或2.在我的'struct align'情况下,'char c'可以为0 ,'short s'可能是1-2,填充可能是3.

为什么2字节长的"短"必须是2字节对齐的?

谢谢

更新我的环境:gcc版本4.4.7,i686,Intel

Eri*_*c Z 4

这是因为从机器的角度来看,a 的成员struct与该类型的单个变量没有区别。无论您选择什么对齐方式,它都适用于两者。

例如,如果short是两个字节长,

struct align
{
    char c;
    short s; // two-byte word
};

short ss; // two-byte word
Run Code Online (Sandbox Code Playgroud)

该成员s是2字节类型(例如IA32中的WORD),与“独立”变量的类型完全相同ss。底层架构将它们视为相同。因此,当涉及到该类型的对齐要求时,它仅适用于两者。

而且如果在数据末尾添加填充,它仍然可能会错位。考虑 的开头ss位于 4 字节边界的末尾。