#low-level #data #cast #array #memory #performance #utility

reinterpret

低级实用函数,用于重新解释数据数组

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日

#2279Rust 模式

Download history 19/week @ 2023-11-26 8/week @ 2023-12-03 3/week @ 2023-12-10 11/week @ 2023-12-17 15/week @ 2023-12-24 13/week @ 2024-01-07 16/week @ 2024-01-14 3/week @ 2024-01-21 3/week @ 2024-01-28 14/week @ 2024-02-04 24/week @ 2024-02-11 12/week @ 2024-02-18 47/week @ 2024-02-25 38/week @ 2024-03-03 19/week @ 2024-03-10

122 每月下载量
用于 8 个crate(3 直接使用)

MIT/Apache 许可

13KB
151

reinterpret

Rust 中重新解释数据数组的低级实用函数

On crates.io On docs.rs Build status

概述

此crate提供方便的低级实用函数,用于重新解释数据。这包括Vecslice。这些函数本质上是不可安全的,但在性能关键代码中非常有用,因为它们避免了额外的复制。

此crate的目标是提供一些在Vecslice边界上的内存安全性,以减少重新解释数据的样板代码。

这些函数检查源数组和目标数组具有相同的大小,但是它们不会检查包含类型的转换安全性。

可以使用这些函数编写安全的包装器来转换具体类型的集合,但这超出了此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.
# }

许可证

此存储库受以下之一许可:

任选其一。

无运行时依赖项