结构的填充大小

时间:2019-04-04 20:28:26

标签: c struct size

我试图了解结构在C中的工作原理。更确切地说,是结构的大小。

当我打印以下结构的大小时:

struct Test {
   char tab[14];
};

我有输出14

但是

的大小
    struct Test2{
         uint16_t  a;
         uint16_t  b;
         uint16_t   c;
         uint64_t  d; 
    };

等于16

我在上一篇文章中读到,有一个“添加填充来满足对齐约束”。那么为什么这种填充方法不适用于第一个示例?

2 个答案:

答案 0 :(得分:3)

不允许在数组中间应用填充(否则会破坏其他指针算法)。因此tab的所有元素都是连续的

此外,tab[0]的地址必须与Test的相应实例的地址相同;即struct的开头不允许填充。

但是,最后可能会有填充。不过,就您而言,没有。

答案 1 :(得分:2)

填充与必须排列对象的对齐方式有关。您的第一个结构只有一个char成员,因此可以将其放置在任何地址。因此,无需填充,因为此类野兽数组中的下一个元素可以紧随其后。

对于包含具有不同对齐约束的成员的其他结构,情况变得更加复杂。必须在内部填充它们以适应不同的对齐要求,如果整体对齐方式与尺寸不符,则最后可能会有填充。