Recentemente, li Type Layout e fiquei surpreso com a descrição de repr primitivo em enums. Consulte Representação primitiva de enums com campos e Combinando representações primitivas de enums com campos e#[repr(C)]
. Minha pergunta é: essas duas representações não são equivalentes?
Mais concretamente, considere esta enumeração:
enum WithFields {
A(u16),
B(u8, u16),
C(u32, u32),
}
Se fosse anotado com repr(u8)
, teria a mesma representação UnionWithTag
abaixo:
#[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);
Se fosse anotado com repr(C, u8)
, teria a mesma representação TaggedUnion
abaixo:
#[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);
Não são TaggedUnion
e UnionWithTag
idênticos no layout?