结构的填充大小

Padding size of struct

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

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

struct Test {
   char tab[14];
};

我有输出 14.

但是

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

等于16.

我在之前的 post 中读到有一个 "padding added to satisfy alignment constraints"。那为什么这个填充不适用于第一个例子?

不允许在数组中间应用填充(否则指针运算会中断)。所以tab的所有元素都是连续的.

此外tab[0]的地址需要与Test对应实例的地址相同;即在 struct.

的开头不允许填充

但是,最后可能会有填充。不过在你的情况下,没有。

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

对于包含具有不同对齐约束的成员的其他结构,事情变得更加复杂。它们必须在内部填充以适应不同的对齐要求,如果整体对齐与大小不一致,则可以在末尾进行填充。