与数据结构对齐混淆?

标签 c struct padding long-double

代码 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/

相关文章:

swift - 结构内部的 Swift float 问题

c - 保留结构而不进行动态分配

html - 无法将填充或边距应用于 "lead"类 <p> 元素

互斥锁解锁和从函数返回之间是否会出现竞争条件

c - 用于接受和打印字符串的非常小的 C 程序中的段错误

c - c中的叉树取决于特定参数

c - 指针、数组和传递指针到方法

在另一个结构中创建结构数组

php - mcrypt_decrypt - 奇怪的填充(不是默认的,不是空的)

css - 标题上方的空格不会离开。在 safari 中可以,但在 firefox 中不行