在结构中使用 long double 时的对齐

Alignment when using a long double in a structure

我知道一般来说,结构实例将具有其最宽标量成员的对齐方式。我声明了一个具有 long double 数据类型成员的结构。

struct try
{
    char a;
    long double b;
};
struct try obj;

当我试图检查 sizeof(obj) 时,它显示为 16。我的编译器假定 long double12 字节。所以我无法理解这里究竟是如何进行填充的,以及结构中是如何进行对齐的。我假设对齐将在 long double 的基础上完成,因为它是最宽的标量成员。所以 char 应该有一个 11 字节填充,结构变量的大小应该是 24 但输出是 16。那么这里到底发生了什么?我正在开发 64 bit 处理器。

首先,即使您有 64 位处理器,您的编译器也会创建 32 位输出。无论如何,您假设事物需要与与其大小相同的边界对齐,这通常是不正确的。特别是,在您的情况下,long doubles 占用 12 个字节,但只需要对齐到 4 个字节的边界。因此,在您的单字节 char 之后,编译器插入 3 个字节的填充以达到 4 字节的边界,然后插入您的 12 字节 long double。 1+3+12 是 16,所以 struct try 是 16 个字节长。