gpt4 book ai didi

pointers - 当 Vec 被 move 时,我可以(不安全地)持有一个指向 Vec 元素的指针吗?

转载 作者:行者123 更新时间:2023-12-03 11:25:01 24 4
gpt4 key购买 nike

我正在实现一个算法,为了保持所需的时间复杂度,我想持有一个指向 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


  • 您在 move 期间没有更改后备分配。这可能是由于对 Vec 的任何修改造成的。这会导致调整大小或破坏。
  • 当您尝试使用引用时,不存在对同一元素的别名引用(包括可能到达同一元素的任何内容)。

  • 对于这个例子,我只使用一个索引( 1 )。对于您的树案例,我会尝试使用索引向量。进行基准测试以查看是否存在明显差异。

    关于pointers - 当 Vec 被 move 时,我可以(不安全地)持有一个指向 Vec 元素的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63564269/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com