如果我想安全地编写Rust代码,我应该不使用指针算法进行编码吗?

问题描述 投票:0回答:2

我已经读过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);
        }
    }
}

如果我想安全地编写Rust代码,我应该在不使用指针算法的情况下进行编码,并且仅使用相应的数组索引吗?或者还有其他方法吗?

pointers rust pointer-arithmetic
2个回答
9
投票

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

那你就不应该使用unsafeunsafe有一些合理的原因(例如访问已知且可安全使用的存储器位置,例如在微控制器的几个寄存器上),但通常不应使用它。

应该不使用指针算法进行编码,只使用数组的相应索引

是。根本没有理由(在这个特定情况下)使用unsafe。只是用

for i in 0..buf.len() {
    println!("Value {}", buf[i]);
}

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

for i in &buf {
    println!("Value {}", i);
}

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);
    }
}

这也更容易阅读,并且不会引入记忆不安全的风险。


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

© www.soinside.com 2019 - 2024. All rights reserved.