默认情况下,Zig中的所有结构体字段自然对齐到@alignOf(FieldType)(ABI大小),但没有定义布局。有时,您可能希望具有不符合您的C ABI的定义布局的结构体字段。packed结构体允许您对结构体字段进行极其精确的控制,允许您逐位放置字段。
在packed结构体内部,Zig的整数占用其位宽的空间(即,u12的@bitSizeOf为12,意味着它将在packed结构体中占用12位)。布尔值也占用1位,这意味着您可以轻松实现位标志。
- const MovementState = packed struct {
- running: bool,
- crouching: bool,
- jumping: bool,
- in_air: bool,
- };
-
- test "packed struct size" {
- try expect(@sizeOf(MovementState) == 1);
- try expect(@bitSizeOf(MovementState) == 4);
- const state = MovementState{
- .running = true,
- .crouching = true,
- .jumping = true,
- .in_air = true,
- };
- _ = state;
- }
类似于对齐指针,位对齐指针在其类型中有额外的信息,这说明了如何访问数据。当数据不是字节对齐时,这是必要的。位对齐信息通常需要寻址packed结构体内部的字段。