考虑一下,
#include<stdio.h>
struct outside1
{
int a;
char b;
char c;
char d[3];
};
struct outside2
{
char a,b,A[2];
char B[2];
};
int main()
{
printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2));
return 0;
}
通过使用填充概念预测输出,它将是“12 8”。但实际输出是“12 6”。
使用 gcc 4.7.2 Debian
谁能解释一下?
-新手
最佳答案
char
和 int
几乎在任何实现中都有其自身大小的对齐要求。
sizeof(char)
每个标准为 1,int
的常见大小为 1、2 和 4。
这导致 outside1
的常见大小为 6、8、12。
对于 outside2
of 6.
顺便说一句:编译器被允许在每个结构成员之后插入任意数量的填充,尽管它通常使用最小必要量来解决对齐限制,以便轻松遵循“公共(public)初始子序列”规则。
此外,由于 C99 或相关版本的对齐方式仅限于 2 的幂,并且对象大小必须能被它整除。
关于c - sizeof(struct) 不遵循填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22972924/