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 字节?
编译器尝试对齐结构类型的对象,以使具有最严格对齐的数据成员适当对齐。
在这个结构声明中
struct
{
uint8 a;
uint16 b;
uint8 c;
}ABC;
Run Code Online (Sandbox Code Playgroud)
具有最严格对齐的数据成员是数据成员b。其地址应按两个字节对齐。因此数据成员a被填充了一个字节。为了使该结构的对象的地址按 2 个字节对齐,数据成员c也用 1 个字节填充。