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

标签 pointers rust move-semantics unsafe vec

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

    相关文章:

    当对象添加到向量时,Rust wasm_bindgen 对象在 JS 端变为空

    error-handling - 使用rust 错误 : The size for values of type `(dyn std::error::Error + ' static)` cannot be known at compilation time

    c++ - 当您将文字常量分配给右值引用时会发生什么?

    c - 初始化为非局部指针后从函数返回指针

    c++ - 释放空指针

    c++ - 来自右值的非常量引用的无效初始化

    c++ - 在 C++11 中使用什么更好,零或 NULL?

    random - 如何在 Rust 中生成一串具有特定大小的随机 ASCII 可打印字符?

    c++ - 返回 std::move(m_field) 还是返回 m_field?

    c++ - 为什么 move 构造函数既没有用clang声明也没有删除?