gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:04:04 25 4
gpt4 key购买 nike

这是一个 C 结构的声明:

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

在我的环境中,sizeof(struct align) 为 4,填充 1 个字节位于“char c”和“short 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。在我的 'struct align' 案例中,'char c' 可以为 0,'short s' 可以为 1-2,padding 可以为 3。

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

谢谢

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

最佳答案

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

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

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

short ss; // two-byte word

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

而且如果在数据末尾加上padding,还是有可能错位的。考虑 ss 的开始是在 4 字节边界的末尾。

关于c - 为什么 short 是 2 字节对齐的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23027140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com