您的位置:首页 > 财经 > 产业 > 会计事务所_搜索引擎优化的简写是_优化网站搜索_百度搜索量查询

会计事务所_搜索引擎优化的简写是_优化网站搜索_百度搜索量查询

2025/3/17 23:42:05 来源:https://blog.csdn.net/LuckyLay/article/details/144278119  浏览:    关键词:会计事务所_搜索引擎优化的简写是_优化网站搜索_百度搜索量查询
会计事务所_搜索引擎优化的简写是_优化网站搜索_百度搜索量查询

Rust学习笔记_12——闭包
Rust学习笔记_13——枚举
Rust学习笔记_14——结构体


Union

文章目录

    • Union
      • 1. 基本用法
      • 2. 注意事项
      • 3. 示例


在Rust编程语言中,union 是一种特殊的数据结构,允许你在同一个内存位置存储不同类型的值。这与枚举(enum)有些相似,但有一个关键的不同点:在 union 中,所有的字段共享同一块内存,这意味着在任何给定时间,union 只能安全地包含一个有效的值。

1. 基本用法

#[repr(C)]
union MyUnion {i: i32,f: f32,s: [u8; 4],
}// MyUnion 可以在同一个内存位置存储一个 i32、一个 f32 或一个由4个 u8 组成的数组。
// #[repr(C)] 属性确保 union 的布局与C语言中的 union 布局一致,这对于与C语言代码进行互操作非常有用

2. 注意事项

  1. 内存布局union 的内存布局是固定的,并且与C语言的 union 兼容。因此,它们常用于与C代码进行互操作。
  2. 安全性:直接访问 union 中的字段是不安全的,因为你无法确定当前哪个字段是有效的。因此,通常结合枚举来跟踪状态,并在安全的情况下访问 union 中的数据。
  3. 生命周期union 本身不包含生命周期信息,因此在使用包含引用的 union 时需要特别小心,以避免悬挂指针或未定义行为。

3. 示例

// 这里定义了一个 union,名为 MyUnion,它可以在同一个内存位置存储一个 i32、一个 f32 或一个由4个 u8 组成的数组。
// #[repr(C)] 属性确保 union 的布局与C语言中的 union 布局一致。
#[repr(C)]
union MyUnion {i: i32,f: f32,s: [u8; 4],
}// 这个枚举用于跟踪 union 中当前存储的数据类型。每个变体都包含与 union 中相应字段相同类型的值。
#[derive(Debug)]
enum MyUnionState {Int(i32),Float(f32),Bytes([u8; 4]),
}// 结构体 MyStruct 包含两个字段:data(MyUnion 类型)和 state(MyUnionState 类型)。
// data 字段用于存储实际的数据
// state 字段用于跟踪当前存储的数据类型。
struct MyStruct {data: MyUnion,state: MyUnionState,
}// 为 MyStruct 实现了两个构造函数:new_int 和 new_float。
// 这些函数分别用于创建包含 i32 和 f32 值的 MyStruct 实例。
impl MyStruct {fn new_int(value: i32) -> Self {MyStruct {data: MyUnion { i: value },state: MyUnionState::Int(value),}}fn new_float(value: f32) -> Self {MyStruct {data: MyUnion { f: value },state: MyUnionState::Float(value),}}fn value_int(&self) -> Option<i32> {if let MyUnionState::Int(value) = &self.state {Some(unsafe { self.data.i })} else {None}}fn value_float(&self) -> Option<f32> {if let MyUnionState::Float(value) = &self.state {Some(unsafe { self.data.f })} else {None}}
}fn main() {let int_val = MyStruct::new_int(42);let float_val = MyStruct::new_float(3.14);println!("Int value: {:?}", int_val.value_int());println!("Float value: {:?}", float_val.value_float());
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com