在结构中使用长双精度时的对齐方式

问题描述 投票:0回答:1

我通常知道,一个struct实例将对齐其最宽的标量成员。我声明了一个具有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处理器。

c struct padding memory-alignment long-double
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.