我不明白为什么编译器在 4 字节边界上对齐 int,在 2 字节边界上对齐 Short,在 1 字节边界上对齐 char。
据我了解,如果处理器的数据总线宽度是 4 字节,则从不是 4 的倍数的地址读取 int 需要 2 个内存读取周期。
那么,为什么编译器不将所有数据对齐 4 字节边界呢?
例如:
struct s {
char c;
short s;
};
这里,
1) 为什么编译器在 2 字节边界上短对齐?假设处理器可以在单个内存读取周期中获取 4 个字节,那么在上述情况下,即使 char 和 Short 之间没有填充,读取 Short 不是只需要 1 个内存读取周期吗?
2) 为什么编译器不在 4 字节边界上短对齐?
这些对象必须适合数组。数组是连续的。因此,如果第一个元素是 N 字节对齐的,并且所有对象都是 N 字节大,那么数组中的所有对象也必然是 N 字节对齐的。
So, if short
将是 2 个字节大,但 4 个字节对齐,数组中的所有 Shorts 之间会有 2 个字节空洞,这是禁止的。
您确实发现您的假设略有缺陷。我可以做一个struct
有 26 个字符,并且它不会是 26 字节对齐的。它可以从任何地方开始。 N 字节类型的对齐方式等于 N或除以 N.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)