我正在实现一个算法,为了保持所需的时间复杂度,我希望在 Vec
移动时能够持有指向其中一个元素的指针。
具体来说,就是这样:
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
。这里我不是询问编程风格,而是在问这段代码是否可以依赖于我认为它应该做的事情。由于
Vec
必须在堆上保存其内容,并且移动等同于Rust中的memcpy
,我的想法是Vec
可移动的事实意味着我的代码是正确的(即没有未定义的行为)。这个想法正确吗?
Vec
是否确实保证在任何情况下都将其元素保存在堆上?它是否有可能进行一些小的向量优化(例如,如果只有最多4个元素,则将元素保存在数组中)? - phimuemueVec
有from_raw_parts
和into_raw_parts
方法,如果存在小向量优化,我认为这些方法就无法实现。 - Bernard