敖雨燕 发表于 3 天前

rust学习二十.4、RUST使用不安全代码访问union(一存多表)类型

一、前言

看UNION的定义,颇为惊讶,居然有这样的类型(以前没有怎么用过C)。
以下一段来自于文心一言:
1.定义和用途
union允许在相同的内存位置存储不同类型的数据,但在任意时刻只能使用其中一个类型。
适用于需要在节省内存的情况下灵活存储不同类型数据的场景。
2.内存布局
所有字段共享相同的内存位置。
这意味着union的大小由其最大字段决定。
3.安全性与用法
由于在同一内存位置存储不同类型,使用时需要特别注意,确保每次只访问当前的有效类型。
需要使用unsafe块来读取或写入union的字段,因为Rust无法保证类型安全。
本人看法
其一、叫联合好像不容易理解,不如称为 "一容各表"、“一存多表"之类的,类似于“一x各表”
其二、比较难于理解这个类型的存在,毕竟类似的业务代码没有写过
二、示例

union Uscore {
    a: u32,
    b: f32,
}

union Ucode {
    a: u8,
    b: char,
}

fn main() {
    let mut u = Uscore { a: 10 };
    unsafe {
      println!("{}", u.b); // 输出:0
      u.b = 20.0;
      println!("{}", u.a); // 输出:20
    }

    println!("---- 现在测试另外一个union类型 ---- ");
    let x: u8 = 87;
    let mut u2 = Ucode { a: x };
    unsafe {
      println!("a={},b={}", u2.a, u2.b);
      u2.b = 'W';
      println!("a={},b={}", u2.a, u2.b);
    }
}输入如下:

三、小结

知道的非常少,说几点个人感受深的:
1.居然有这种类型,看来rust是要挑战c
2.需要用不安全代码块访问
3.如何称呼,还真是一个小问题,称为"一存多表"类型吧
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: rust学习二十.4、RUST使用不安全代码访问union(一存多表)类型