我最近通读了Type Layout,对枚举上原始 repr 的描述感到惊讶。请参阅带有字段的枚举的原始表示和将枚举的原始表示与字段和 组合#[repr(C)]
。我的问题是,这两种表示不是等价的吗?
更具体地说,考虑这个枚举:
enum WithFields {
A(u16),
B(u8, u16),
C(u32, u32),
}
如果用 注释repr(u8)
,它将具有与UnionWithTag
以下相同的表示:
#[repr(C)]
union UnionWithTag {
a: VariantA,
b: VariantB,
c: VariantC,
}
#[derive(Copy, Clone)]
#[repr(u8)]
pub enum Tag {
A,
B,
C,
}
#[derive(Copy, Clone)]
#[repr(C)]
struct VariantA(Tag, u16);
#[derive(Copy, Clone)]
#[repr(C)]
struct VariantB(Tag, u8, u16);
#[derive(Copy, Clone)]
#[repr(C)]
struct VariantC(Tag, u32, u32);
如果用 注释repr(C, u8)
,它将具有与TaggedUnion
以下相同的表示形式:
#[repr(C)]
struct TaggedUnion {
tag: Tag,
payload: Union,
}
#[derive(Copy, Clone)]
#[repr(u8)]
pub enum Tag {
A,
B,
C,
}
#[repr(C)]
pub union Union {
a: PayloadA,
b: PayloadB,
c: PayloadC,
}
#[derive(Copy, Clone)]
#[repr(C)]
struct PayloadA(u16);
#[derive(Copy, Clone)]
#[repr(C)]
struct PayloadB(u8, u16);
#[derive(Copy, Clone)]
#[repr(C)]
struct PayloadC(u32, u32);
TaggedUnion
和UnionWithTag
布局不一样吗?