我试图了解结构在C中的工作原理。更确切地说,是结构的大小。
当我打印以下结构的大小时:
struct Test {
char tab[14];
};
我有输出14
。
但是
的大小 struct Test2{
uint16_t a;
uint16_t b;
uint16_t c;
uint64_t d;
};
等于16
。
我在上一篇文章中读到,有一个“添加填充来满足对齐约束”。那么为什么这种填充方法不适用于第一个示例?
答案 0 :(得分:3)
不允许在数组中间应用填充(否则会破坏其他指针算法)。因此tab
的所有元素都是连续的。
此外,tab[0]
的地址必须与Test
的相应实例的地址相同;即struct
的开头不允许填充。
但是,最后可能会有填充。不过,就您而言,没有。
答案 1 :(得分:2)
填充与必须排列对象的对齐方式有关。您的第一个结构只有一个char
成员,因此可以将其放置在任何地址。因此,无需填充,因为此类野兽数组中的下一个元素可以紧随其后。
对于包含具有不同对齐约束的成员的其他结构,情况变得更加复杂。必须在内部填充它们以适应不同的对齐要求,如果整体对齐方式与尺寸不符,则最后可能会有填充。