为什么结构及其 typedef 在对齐时占用不同的大小?
Why structure and its typedef consume different size when aligned?
我原以为两个尺寸都是 8,但我得到 sizeof(myStruct) = 16, sizeof(myType) = 8
。我用 MinGW 在 Windows 64 位机器上编译了这个。
#include <stdio.h>
#include <stdint.h>
struct s1{
int8_t a;
int32_t b;
} __attribute__((aligned));
typedef struct{
int8_t a;
int32_t b;
}s2 __attribute__((aligned));
struct s1 myStruct;
s2 myType;
int main(int argc, char **argv)
{
printf("sizeof(myStruct) = %zu, sizeof(myType) = %zu\n", sizeof(myStruct), sizeof(myType));
return 0;
}
struct s1 { … } __attribute__((aligned));
表示 struct s1
的成员应该与目标的“最大对齐”对齐,这显然是 8 个字节。所以每个成员都放置在 8 字节的倍数处,使整个结构为 16 字节。 (GCC documentation on this 没有说明为结构指定此属性会影响其成员,但情况似乎是这样。)
typedef struct { … } s2 __attribute__((aligned));
说s2
是普通对齐要求的结构,所以它的b
成员放在4字节的倍数处,总大小为8字节,然后s2
类型应该对齐到“最大对齐”。因此,当创建s2
个对象时,它们将被放置在8的倍数的位置,但其中成员的布局不会改变。
要使使用 typedef
定义的 structure
与 struct s1
具有相同的布局,您可以使用 typedef struct { … } __attribute__((aligned)) s2;
.
我原以为两个尺寸都是 8,但我得到 sizeof(myStruct) = 16, sizeof(myType) = 8
。我用 MinGW 在 Windows 64 位机器上编译了这个。
#include <stdio.h>
#include <stdint.h>
struct s1{
int8_t a;
int32_t b;
} __attribute__((aligned));
typedef struct{
int8_t a;
int32_t b;
}s2 __attribute__((aligned));
struct s1 myStruct;
s2 myType;
int main(int argc, char **argv)
{
printf("sizeof(myStruct) = %zu, sizeof(myType) = %zu\n", sizeof(myStruct), sizeof(myType));
return 0;
}
struct s1 { … } __attribute__((aligned));
表示 struct s1
的成员应该与目标的“最大对齐”对齐,这显然是 8 个字节。所以每个成员都放置在 8 字节的倍数处,使整个结构为 16 字节。 (GCC documentation on this 没有说明为结构指定此属性会影响其成员,但情况似乎是这样。)
typedef struct { … } s2 __attribute__((aligned));
说s2
是普通对齐要求的结构,所以它的b
成员放在4字节的倍数处,总大小为8字节,然后s2
类型应该对齐到“最大对齐”。因此,当创建s2
个对象时,它们将被放置在8的倍数的位置,但其中成员的布局不会改变。
要使使用 typedef
定义的 structure
与 struct s1
具有相同的布局,您可以使用 typedef struct { … } __attribute__((aligned)) s2;
.