【发布时间】:2019-04-09 14:01:12
【问题描述】:
我是结构的新手,正在学习如何计算结构的大小。我知道填充如何发挥作用以正确对齐内存。据我了解,对齐是为了使内存中的大小成为 4 的倍数。 我在 GCC 上尝试了以下代码。
struct books{
short int number;
char name[3];
}book;
printf("%lu",sizeof(book));
最初我以为short int 会占用2 个字节,然后是字符数组,从开头的第三个内存位置开始。然后,字符数组需要 3 个字节的填充,其大小为 8。像这样,每个单词代表内存中的一个字节。
short 短字符 char
字符填充填充填充
但是在运行时它的大小为 6,这让我感到困惑。
任何帮助将不胜感激,谢谢!
【问题讨论】:
-
编译器可以随意填充结构成员。在您的情况下,它看起来只关心它是否是最大结构元素的倍数。
-
struct与其中最大对齐的元素对齐。在这种情况下,short与 2 个字节对齐,char仅与 1 个字节对齐,因此结构体与 2 个字节对齐。你有一个 2 字节的short,0 字节的对齐填充,3 字节的char,然后在结构的末尾有 1 个字节的对齐填充,使其成为对齐的倍数。 2+0+3+1=6。 -
您好,欢迎来到 StackOverflow。好问题。
-
虽然每个元素都必须根据其大小对齐,但结构的 start 必须与 largest 结构元素对齐。 IE。如果你有
uint8_t a; uint16_t b; uint64_t c; uint8_t d;,在a之后会有一个1B的填充,b之后会有7B的填充,c之后没有填充,然后d之后会有7B的填充。当你有一个结构数组时,需要最后的填充来确保c将对齐。