结构的填充大小
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
成员,因此它可以位于任何地址。因此不需要填充,因为此类野兽数组中的下一个元素可能紧随其后。
对于包含具有不同对齐约束的成员的其他结构,事情变得更加复杂。它们必须在内部填充以适应不同的对齐要求,如果整体对齐与大小不一致,则可以在末尾进行填充。
我正在尝试了解结构在 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
成员,因此它可以位于任何地址。因此不需要填充,因为此类野兽数组中的下一个元素可能紧随其后。
对于包含具有不同对齐约束的成员的其他结构,事情变得更加复杂。它们必须在内部填充以适应不同的对齐要求,如果整体对齐与大小不一致,则可以在末尾进行填充。