[有人问我为什么结构需要内部填充。这是我的回复。]
发件人:scs@eskimo.com (Steve Summit)
日期:2002 年 3 月 17 日 20:56:35 -0500
Message-Id:<2002Mar17.2056.scs.007@aeroroot.scs.ndip.eskimo.net>
你写道
> ... 仍然困扰我大脑的是为什么结构
> 需要内部填充
这是为了“对齐”。许多处理器无法访问 2 字节和 4 字节的数量(例如 int 和 long int),如果它们随意地挤在一起。
假设你有这个结构
struct { char a[3]; short int b; long int c; char d[3]; };
现在,你可能认为可以像这样将结构打包到内存中
+-------+-------+-------+-------+ | a | b | +-------+-------+-------+-------+ | b | c | +-------+-------+-------+-------+ | c | d | +-------+-------+-------+-------+
但如果编译器像这样安排它,对处理器来说会容易得多
+-------+-------+-------+ | a | +-------+-------+-------+ | b | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | +-------+-------+-------+
在“packed”版本中,请注意,你我很难看出 b 和 c 字段是如何换行的?简而言之,对处理器来说也很困难。因此,大多数编译器会像这样“填充”结构(好像是额外的、不可见的字段)
+-------+-------+-------+-------+ | a | pad1 | +-------+-------+-------+-------+ | b | pad2 | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | pad3 | +-------+-------+-------+-------+