代码 1:-
struct emp
{
char a;
double b;
};
int main()
{
struct emp e;
printf("%p %p", (void*)&e.a, (void*)&e.b);
}
我电脑上的输出:-
OO28FF00 0028FF08
由于 char
和 double
的大小分别为“1”和“8”,因此 0028FF00
和 0028FF08
分别是 '1' 和 '8' 的倍数。
代码 2:-
struct emp
{
char a;
long double b;
};
int main()
{
struct emp e;
printf("%p %p \n", (void*)&e.a,(void*)&e.b);
}
输出是:-
0028FF00 0028FF04
因为 char
和 long double
的大小分别是 '1' 和 '12' 但 0028FF04
不是 '12' 的倍数'.
为什么在这种情况下不应用填充?
最佳答案
long double
是一个 80 bit floating point所以你需要 10 个字节。 10 确实不是一个很好的大小,因此 Intel 32 位处理器决定使用 12 字节。 12 是 4 的倍数,表示 32 位(3 x 32 位)。这被认为是对齐的,因为 32 位处理器只需要 4 字节对齐,所以 12 字节在任何 4 字节边界对齐。显然,编译器知道自己在做什么,并且总是尝试生成尽可能小的结构。
这就是说,这是您看到不能使用结构声明并希望将其按原样保存在文件中的地方……至少不能使用默认的 C 类型(您可以使用 int32_t、uint64_t 等。得到你想要的东西,但 float 没有等价物......)
正如有人评论的那样,在 64 位架构上,long double 是 16 个字节。浪费了 6 个字节……但它使类型始终保持 64 位对齐。
关于与数据结构对齐混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21643239/