【发布时间】:2022-01-02 05:42:31
【问题描述】:
从get_array() 函数返回(移动)数组时,是否复制了元素?
fn get_array() -> [u8; 4] {
let a = [0, 1, 2, 3];
let mut b = a; // a move here produces the array to be copied over
b[2] = 10;
a
}
fn main() {
let a = get_array();
println!("{:?}", a);
}
【问题讨论】:
-
在本例中,它们将被复制。据我所知,所有数组都是在移动时复制的。不过,我对移动语义只有粗略的了解,所以可能会有一些例外。
-
问题未指定。有时数据会被复制,有时则不会,这取决于优化。举个简单的例子,
get_array可以被内联,分配给b被认为是无用的,因此不需要复制。 -
在没有优化的假设土地上,是的,它正在被复制。但是,我们并不生活在那个假设的土地上,因此可以进行许多优化。在这种情况下,
get_array()将在编译时替换为[0, 1, 2, 3],而在其他情况下,数组可能会直接在父函数的堆栈帧中构造,以避免不必要的复制。当然,有时副本是不可避免的。 -
每个 移动在概念上都是(微不足道的,按位)复制。 move 和 copy 之间的唯一区别是 move 使原始文件无法访问并防止其被丢弃。正如其他人指出的那样,当优化器可以证明这样做是安全的时,可以消除实际的复制。
标签: arrays rust move-semantics