2014-04-12 61 views
3

这里是一个C结构的声明:为什么短为2字节对齐?

struct align 
{ 
    char c; //1 byte 
    short s;//2 bytes 
}; 

在我的环境中,的sizeof(结构对准)是4和填充1个字节是“字符c”和“短S”之间。有人说这是因为'short'必须是2字节对齐的,所以在'char c'后面写入1个字节。在32位机器上,我知道'int'最好是4字节对齐,以防止2个存储器读取周期,因为在CPU和存储器之间的地址总线上发送的地址是4的倍数。但'short'是2个字节,超过4个字节,所以它的地址可能是4个字节单位内的任何字节(除了最后一个字节)。

4的地址的倍数 - > | 0 | 1 | 2 | 3 |我的意思是,'short'可以从0,1或2开始。所有可以通过1个读周期检索,不必是0或2.在我的'结构对齐'情况下,'char c'可以为0,'short s'可以为1-2,填充可以为3.

为什么2字节长的“short”必须是2字节对齐的?

感谢

更新我的环境: gcc版本4.4.7,i686的,英特尔

+0

你使用什么编译器和平台?你已经设置了哪些编译器选项? – Dai

+0

这取决于你的编译器和系统架构。你应该在系统中包含这些细节。在某些系统中,“short”必须有2字节对齐。 –

+1

在许多机器上,当数量为N字节对齐时,访问N字节数量(至少对于{1,2,4,8,16}中的N)效率最高。生活就是这样;习惯它,因为我怀疑芯片制造商是否会改变它,只是因为你认为它不是它应该的样子。 –

回答

3

这是因为struct的成员没有从该类型的单变量差异,从机器的角度来看, 。无论您选择什么路线,它都适用于两者。

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

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

short ss; // two-byte word 

的构件s是2个字节的类型(在IA32例如WORD),完全相同的类型一个“独立”变量的ss。底层架构认为它们是一样的。因此,当涉及到该类型的对齐要求时,它只适用于两者。

而且,如果在数据末尾添加填充,它可能仍然未对齐。考虑ss的开头是在4字节边界的末尾。

+0

是的,我认为你的解释是原因。从“独立”变量的角度来看,2字节对齐保证了一个“短”会使得nevel跨越两个4字节的提示,并且CPU在32位机器的1个读取周期内总能得到“short”。 – password636

相关问题