首页 > 解决方案 > 在结构中使用 long double 时的对齐

问题描述

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

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

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

标签: cstructpaddingmemory-alignmentlong-double

解决方案


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


推荐阅读