在结构中使用 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 double
为 12
字节。所以我无法理解这里究竟是如何进行填充的,以及结构中是如何进行对齐的。我假设对齐将在 long double
的基础上完成,因为它是最宽的标量成员。所以 char 应该有一个 11
字节填充,结构变量的大小应该是 24
但输出是 16
。那么这里到底发生了什么?我正在开发 64 bit
处理器。
首先,即使您有 64 位处理器,您的编译器也会创建 32 位输出。无论如何,您假设事物需要与与其大小相同的边界对齐,这通常是不正确的。特别是,在您的情况下,long double
s 占用 12 个字节,但只需要对齐到 4 个字节的边界。因此,在您的单字节 char
之后,编译器插入 3 个字节的填充以达到 4 字节的边界,然后插入您的 12 字节 long double
。 1+3+12 是 16,所以 struct try
是 16 个字节长。
我知道一般来说,结构实例将具有其最宽标量成员的对齐方式。我声明了一个具有 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
s 占用 12 个字节,但只需要对齐到 4 个字节的边界。因此,在您的单字节 char
之后,编译器插入 3 个字节的填充以达到 4 字节的边界,然后插入您的 12 字节 long double
。 1+3+12 是 16,所以 struct try
是 16 个字节长。