- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个 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/
我是一名优秀的程序员,十分优秀!