2个版本
0.1.1 | 2024年5月8日 |
---|---|
0.1.0 | 2024年5月7日 |
#558 in 过程宏
每月26次下载
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