#check #macro #unsafe #bounds #access #skipping #indices

unsafe-access

通过get_unchecked(..)跳过边界检查的实用宏

2个版本

0.1.1 2024年5月8日
0.1.0 2024年5月7日

#558 in 过程宏

每月26次下载

MIT/Apache

9KB
90

unsafe-access

一组Rust过程宏,旨在简化不安全数组索引的使用,同时保持传统索引语义。这些宏在性能关键区域特别有益,在这些区域可以显式跳过边界检查,前提是先进行验证。关键特性是在跳过边界检查的同时保留标准数组索引语法,这可以带来显著的性能提升。

  • unchecked_indices_ref, unchecked_indices_clone, unchecked_indices_copy. 这些宏允许用户通过get_unchecked在有限范围内访问数组元素。这是unsafe代码。
use unsafe_access::unchecked_indices_copy;

let array = [1, 2, 3, 4, 5, 6];
let indices = [0, 3, 5];

let copied_array: [i32; 3] = unchecked_indices_copy! {
    [
        array[indices[0]],
        array[indices[1]],
        array[indices[2]],
    ]
};
  • unsafe_access_fn 一个属性宏,将函数中的标准数组索引转换为不安全、未检查的数组索引。此宏确保函数内的所有索引操作都转换为使用get_unchecked。此示例可参见examples/matrices.rs
use unsafe_access::unsafe_access_fn;

const MATRIX_SIZE: usize = 100;
const QUERY_SIZE: usize = 5;

fn main() {
    let matrix: [u64; MATRIX_SIZE * MATRIX_SIZE] = core::array::from_fn(|i| i as u64);
    let indices: [usize; QUERY_SIZE] = core::array::from_fn(|_| rand::random::<usize>() % (MATRIX_SIZE * MATRIX_SIZE));

    let result = unsafe { prechecked_indices(&matrix, &indices) };
    println!("result: {result:?}");
}

#[unsafe_access_fn]
unsafe fn prechecked_indices<T: Copy, const N: usize>(array: &[T], indices: &[usize; N]) -> [T; N] {
    core::array::from_fn(|i| array[indices[i]])
}

要运行示例,请执行

cargo run --example matrices

基准测试

有关使用随机访问的简单基准测试,请参阅benches/access.rs,或通过

cargo bench

依赖项

~1.5MB
~35K SLoC