我正在实现一个算法,为了保持所需的时间复杂度,我想持有一个指向 Vec
元素的指针。而Vec
正在 move 。
具体来说,是这样的:
fn main() {
let mut v: Vec<usize> = vec![1, 2, 3];
let ptr: *mut usize = &mut v[1] as *mut usize;
let mut u: Vec<usize> = v;
assert!(ptr == &mut u[1] as *mut usize);
println!("{}", unsafe { *ptr });
}
实际代码更复杂,涉及一个树状数据结构,每个顶点拥有一个Vec
child 的。我不是在这里问编码风格,但我的问题是关于是否可以依靠这段代码来做我认为它所做的事情。自
Vec
必须将其内容保存在堆上,而 move 等价于 memcpy
在 Rust 中,我认为事实是 Vec
可 move 意味着我的代码是健全的(即不是未定义的行为)。这样对吗?
最佳答案
你可以这样做:
fn main() {
let mut v: Vec<usize> = vec![1, 2, 3];
let ptr: *mut usize = &mut v[1] as *mut usize;
let mut u: Vec<usize> = v;
assert!(ptr == &mut u[1] as *mut usize);
// I copied this from Stack Overflow without reading the surrounding prose
println!("{}", unsafe { *ptr });
}
您应该记录 unsafe
确切地阻止安全条件是什么以及您如何维护它们。在这种情况下...Vec
的元素是 heap-allocated :If a
Vec
has allocated memory, then the memory it points to is on the heap
Vec
的任何修改造成的。这会导致调整大小或破坏。对于这个例子,我只使用一个索引(
1
)。对于您的树案例,我会尝试使用索引向量。进行基准测试以查看是否存在明显差异。
关于pointers - 当 Vec 被 move 时,我可以(不安全地)持有一个指向 Vec 元素的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63564269/