Rust Book主要讨论移动机制,但是如果我的结构很大,我会看到Rust编译器生成的代码会在将值按值传递给函数时复制该结构的内容:
struct S2 {
a: u64,
b: u64,
c: u64,
d: u64,
e: u64,
f: u64,
g: u64,
h: u64,
i: u64,
}
struct S {
a: u64,
b: u64,
c: u64,
d: u64,
e: u64,
f: u64,
g: u64,
h: u64,
i: u64,
s: S2,
}
fn xxx(xs: S) {
println!("{:p}", &xs.s.a);
}
fn main() {
let ms = S {
a: 1,
b: 1,
c: 1,
d: 1,
e: 1,
f: 1,
g: 1,
h: 1,
i: 1,
s: S2 {
a: 1,
b: 1,
c: 1,
d: 1,
e: 1,
f: 1,
g: 1,
h: 1,
i: 1,
},
};
println!("{:p}", &ms.s.a);
xxx(ms);
}
在输出中,我看到Rust并没有优化ms
到函数参数xs
的移动以使用指针,而是复制了整个内容。我使用了opt-level=3
:
$ ./test
0x7ffeea23a8a8
0x7ffeea23a818
这是我应该担心的事情吗?建议对大型结构使用Box
吗?