fad*_*bee 0 memory-management vector rust
要使用旧向量(我想清空)的内容创建一个新向量,我将使用:
foo.bar = my_vector.drain(0..).collect();
Run Code Online (Sandbox Code Playgroud)
这是惯用的 Rust 吗?
Drain() 是否已优化掉,原始向量的内存是否已分配给新向量?
或者每个元素都被一一复制到新的堆分配中?
我会做
foo.bar = std::mem::take(&mut my_vector);
Run Code Online (Sandbox Code Playgroud)
这是一个更通用的解决方案。
std::mem::take()改变其参数以窃取其内容并将其保留为默认状态。被盗内容用于创建相同类型的新值。
实际的窃取操作是结构本身的简单字节交换(a Vec、a String、任何其他容器的一些指针/整数...)。存储的元素(可能是堆分配的)保留在原处,因此最终此操作非常便宜(复制然后清除很少的字节,即sizeof结构)。