【发布时间】:2021-09-21 15:43:43
【问题描述】:
我需要将一个向量的值分配给另一个向量,例如:
let mut vec_a: Vec<f64> = vec![0.1; 100];
let mut vec_b: Vec<f64> = vec![0.1; 100];
// Do something with vec_a. Real vectors are ~1e6 long
unsafe {
vec_b = Vec::from_raw_parts(&vec_a, vec_a.len(), vec_a.len());
}
我正在寻求帮助来回答这些问题:
有没有更有效、更安全的方法?
如果所有内容都由同一个应用程序/代码处理,为什么它必须在 unsafe 代码下?
如果是正确的方式,用Vec::from_raw_parts代替std::slice::from_raw_parts会不会有区别?
这种需求背后的原因是为了避免复制数据。这可能会以很高的频率发生,并且每次,一个向量将成为跟踪最佳解决方案的存储(比如说vec_a),另一个将探索其他解决方案。当找到更好的解决方案时,唯一需要更改的是将pointer 更改为向量,现在vec_a 存储在vec_b 和vec_b 中找到的最佳解决方案,并且vec_b 可以继续探索不同的解决方案。
【问题讨论】:
-
为什么需要将一个向量的值赋值给另一个向量?你不能使用切片引用来代替吗?或者可能引用向量?
-
您的要求与
vec_b = vec_a.clone();有何不同?您似乎试图避免复制,但如果没有复制,为什么有两个向量? (您所写的内容无法编译,因此不太清楚您期望 unsafe 块做什么。) -
也许只是
vec_b = vec_a;?或者直接回答标题,有std::mem::swap(&mut vec_a, &mut vec_b)?这些都不会复制数据 -
请注意,您当前的代码是不安全的,因为您将有两个向量指向相同的数据。