gpt4 book ai didi

与数据结构对齐混淆?

转载 作者:太空狗 更新时间:2023-10-29 16:12:40 24 4
gpt4 key购买 nike

代码 1:-

struct emp
{
char a;
double b;
};
int main()
{
struct emp e;
printf("%p %p", (void*)&e.a, (void*)&e.b);
}

我电脑上的输出:-

OO28FF00    0028FF08

由于 chardouble 的大小分别为“1”和“8”,因此 0028FF000028FF08 分别是 '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

因为 charlong 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com