Skip to content

联合体 Union

联合体主要用于与 C 语言交互和极端性能优化,在安全 Rust 中很少使用。

语法:

rust
union name{
    item1: type1,
    item2: type2,
    item3: type3,
}

使用union关键字声明一个联合体,每个元素之间使用逗号隔开,最后一行的逗号可保留。每个元素使用item: type格式指明类型。

联合体的特点在于,内部所有变体同时只能使用一个,并且它们共享内存。

比如现在创建一个联合体,让它可以在i32f32之间自由切换:

rust
union IntOrFloat {
    i: i32,
    f: f32,
}

此时访问 IntOrFloat.i就是以整形访问,IntOrFloat.f就是以浮点型访问。

必须把union放到unsafe { }内部处理:

rust
let mut u = IntOrFloat { i: 42 };
unsafe {
    println!("作为整数: {}", u.i);
    u.f = 3.14;
    println!("作为浮点数: {}", u.f); // 未定义行为!
}

联合体在同一内存位置存储不同类型的值,每次只能安全访问当前活跃的字段。因为联合体没有手段去判断当前存储了哪一个变体,这就可能导致一些错误发生,所以要放到unsafe内部处理。

Rust本身其实并不常用这种类型,只是为了兼容C语言才推出的联合体,此处就不深入讲解了。

MIT Licensed