如果我想安全地在Rust中编码,是否应该在不使用指针算术的情况下进行编码?

Tab*_*koj 0 pointers pointer-arithmetic rust

我已经读过Rust的指针算术可以通过该pointer.offset()函数完成,但始终必须在中实现unsafe code

fn main() {
    let buf: [u32; 5] = [1, 2, 3, 4, 5];
    let mut ptr1: *const u32 = buf.as_ptr();
    unsafe {
        let ptr2: *const u32 = buf.as_ptr().offset(buf.len() as isize);
        while ptr1 < ptr2 {
            println!("Address {:?} | Value {}", ptr1, *ptr1);
            ptr1 = ptr1.offset(1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想安全地在Rust中编码,是否应该不使用指针算术而仅使用数组的相应索引进行编码?还是还有其他方法?

hel*_*low 9

如果我想安全地在Rust中编码

那么您不应该使用unsafe。有几个合法的原因unsafe(例如,访问已知且可以安全使用的存储器位置,例如在微控制器上的几个寄存器),但通常不应该使用它。

我应该不使用指针算术而是仅使用数组的相应索引进行编码

是。完全没有理由(在这种情况下)使用unsafe。只需使用

for i in 0..buf.len() {
    println!("Value {}", buf[i]);
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码不被认为是“生锈的”,而是使用for循环

for i in &buf {
    println!("Value {}", i);
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*all 7

使用这样的原始指针[1]不太可能比for迭代器上的惯用循环更快:

fn main() {
    let buf: [u32; 5] = [1, 2, 3, 4, 5];
    for val in buf.iter() {
        println!("Address {:?} | Value {}", val as *const u32, val);
    }
}
Run Code Online (Sandbox Code Playgroud)

这也容易阅读,并且不会带来内存不安全的风险。


1实际上,您的代码每次迭代都会比较两个指针值,因此它可能比惯用法for循环慢得多,后者通常会忽略所有边界检查。