结构体的大小

aha*_*ait 1 c memory sizeof padding

据我所知,结构的大小取决于使用的编译器,并且编译器可能会添加填充以满足对齐要求。

在 64 位系统上。我测试了两个例子:

示例1:

struct
{
    uint8 a;
    uint32 b;
    uint8 c;
}ABC;

size of(uint8 a) == 1 bytes + 3 bytes padding
size of(uint32 b) == 4 bytes + 0 padding
size of(uint8 c) == 1 bytes + 3 padding

==> So, size of(ABC) = 12 bytes.
Run Code Online (Sandbox Code Playgroud)

示例2:

struct
{
    uint8 a;
    uint16 b;
    uint8 c;
}ABC;

size of(uint8 a) == 1 bytes + 1 bytes padding
size of(uint16 b) == 2 bytes + 0 padding
size of(uint8 c) == 1 bytes + 3 padding

==> So, I assumed size of(ABC) = 8 bytes.
Run Code Online (Sandbox Code Playgroud)

但是,编译器返回 (ABC) 的大小 = 6 字节。

为什么示例 2 中的 (ABC) = 6 字节而不是我理解的 8 字节?

Vla*_*cow 5

编译器尝试对齐结构类型的对象,以使具有最严格对齐的数据成员适当对齐。

在这个结构声明中

struct
{
    uint8 a;
    uint16 b;
    uint8 c;
}ABC;
Run Code Online (Sandbox Code Playgroud)

具有最严格对齐的数据成员是数据成员b。其地址应按两个字节对齐。因此数据成员a被填充了一个字节。为了使该结构的对象的地址按 2 个字节对齐,数据成员c也用 1 个字节填充。