结构体的大小如何正确计算?
结构体大小的计算正确是因为“对齐”。许多处理器如果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 |
+-------+-------+-------+
在“压缩”版本中,请注意b和c字段如何包装?简而言之,对处理器来说,这也很困难。因此,大多数编译器会像这样“填充”结构体(好像有额外的不可见字段):
+-------+-------+-------+-------+ | a | pad1 | +-------+-------+-------+-------+ | b | pad2 | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | pad3 | +-------+-------+-------+-------+
在上述映射中,你是否假设int为2字节?
这个问题的原因是很多处理器需要对齐数据,以提高访问效率。解决方法是通过在结构体中添加填充字段来对齐数据,以确保结构体的大小计算正确。