5 个版本
使用旧的 Rust 2015
0.2.1 | 2019年11月5日 |
---|---|
0.2.0 | 2019年8月20日 |
0.1.2 | 2018年11月9日 |
0.1.1 | 2018年8月25日 |
0.1.0 | 2018年8月25日 |
#2279 在 Rust 模式
122 每月下载量
用于 8 个crate(3 直接使用)
13KB
151 行
reinterpret
Rust 中重新解释数据数组的低级实用函数
概述
此crate提供方便的低级实用函数,用于重新解释数据。这包括Vec
和slice
。这些函数本质上是不可安全的,但在性能关键代码中非常有用,因为它们避免了额外的复制。
此crate的目标是提供一些在Vec
和slice
边界上的内存安全性,以减少重新解释数据的样板代码。
这些函数检查源数组和目标数组具有相同的大小,但是它们不会检查包含类型的转换安全性。
可以使用这些函数编写安全的包装器来转换具体类型的集合,但这超出了此crate的范围。
示例
# extern crate reinterpret;
# use reinterpret::*;
# fn main() {
let points: Vec<[f64;2]> = vec![
[0.1, 1.0],
[1.2, 1.4],
[0.5, 3.2],
];
let coordinates: Vec<f64> = vec![0.1, 1.0, 1.2, 1.4, 0.5, 3.2];
let point_coordinates: &[f64] = unsafe { reinterpret_slice(&points) };
assert_eq!(*point_coordinates, *coordinates.as_slice()); // Same data.
assert_eq!(point_coordinates, coordinates.as_slice()); // Same location in memory.
let coordinate_points: &[[f64;2]] = unsafe { reinterpret_slice(&coordinates) };
assert_eq!(*coordinate_points, *points.as_slice()); // Same data.
assert_eq!(coordinate_points, points.as_slice()); // Same location in memory.
# }
未定义行为
有几种方法可以误用这些函数而不会导致panic,可能会产生未定义行为。例如
# extern crate reinterpret;
# use reinterpret::*;
# fn main() {
let a = 1;
let b = 2;
let v = vec![&a, &b];
let mut m: Vec<&mut usize> = unsafe { reinterpret_vec(v) };
*m[0] = 3; // mutating through a shared reference is UB.
# }
许可证
此存储库受以下之一许可:
- Apache 许可证2.0版本,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。