【发布时间】:2014-09-12 10:35:42
【问题描述】:
我不明白为什么编译器在 4 字节边界上对齐 int,在 2 字节边界上对齐 short,在 1 字节边界上对齐 char。
我知道,如果处理器的数据总线宽度为 4 个字节,则需要 2 个内存读取周期才能从地址不是 4 的倍数读取 int。
那么,为什么编译器不在 4 字节边界上对齐所有数据呢?
例如:
struct s {
char c;
short s;
};
这里, 1)为什么编译器在 2 字节边界上对齐短?假设处理器可以在单个内存读取周期中获取 4 个字节,那么即使 char 和 short 之间没有填充,在上述情况下读取 short 也只需要 1 个内存读取周期吗?
2) 为什么编译器不在 4 字节边界上对齐 short?
【问题讨论】:
-
Purpose of memory alignment 的可能重复项
-
结构填充对齐的目的是在一台机器读取中获取数据。在您的情况下,结构将是 4 而不是 8。您仍然可以使用掩码在一个周期内获取 char OR short 。因此,在获取 char 时,处理器将获取 4 个字节并屏蔽 24 位。
但是,如果您有这样的事情:struct s { char c; int i};那么大小将变为 8 个字节,因为您需要完整的 4 个字节要在读取周期中获取的整数。 -
@NikhilVidhani:我的问题不是关于填充的目的。我的问题是关于为什么字节在 char 和 short 之间而不是在 short 之后填充。假设处理器可以在单个周期内获取 4 个字节,那么无论填充发生在哪里,短时间都可以在 1 个周期内获取,对吗?那么,在上述情况下,我们节省了多少?我想对此有一些硬件级别的解释。
-
@linuxfreak 凭我的直觉...我认为如果 short 占用字节 2 和 3,获取(掩码)最后 16 位比 9-24 位更容易。
-
@NikhilVidhani - 是的……我想是的。要获取 9-24 位,处理器除了屏蔽之外还必须进行位移。
标签: c memory compiler-construction memory-alignment