我已经阅读到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中编码,是否应该不使用指针算术而仅使用数组的相应索引进行编码?还是还有其他方法?
答案 0 :(得分:9)
如果我想安全地在Rust中编码
然后,您不应使用unsafe
。有unsafe
的合法原因(例如,访问已知且可以安全使用的内存位置,例如在微控制器上的多个寄存器),但通常不应该使用它。
我应该不使用指针算术而是仅使用数组的对应索引进行编码
是的。 (在这种特定情况下)根本没有理由使用unsafe
。只需使用
for i in 0..buf.len() {
println!("Value {}", buf[i]);
}
但是,此代码不被认为是“生锈的”,而是使用for循环
for i in &buf {
println!("Value {}", i);
}
答案 1 :(得分: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
循环要慢得多,后者常常会忽略所有边界检查。>