我通常知道,一个struct实例将对齐其最宽的标量成员。我声明了一个具有long double
数据类型成员的结构。
struct try
{
char a;
long double b;
};
struct try obj;
[当我尝试检查sizeof(obj)
时,它显示为16
。我的编译器假定long double
为12
字节。因此,我无法理解此处的填充方式以及结构中对齐的方式。我假设对齐将基于long double
完成,因为它是最宽的标量成员。因此,对于char应该有一个11
字节填充,结构变量的大小应为24
,但输出为16
。那么,这里到底发生了什么?我正在使用64 bit
处理器。
首先,即使您使用的是64位系统,您的编译器也会创建32位输出。无论如何,您假设事物需要对齐到与其大小相同的边界,这通常是不正确的。特别是在您的情况下,long double
占用12个字节,但只需要对齐4个字节的边界即可。这样,在单字节char
之后,编译器将插入3字节的填充以达到4字节的边界,然后再插入12字节的long double
。 1 + 3 + 12为16,因此struct try
的长度为16个字节。