Skip to content

G.FUD.01 内存拷贝代价大的参数应按地址传递

【级别】 建议

【描述】

Rust 中的所有权转移也意味着一次栈内存的拷贝,因此所有非引用和指针类型的参数传递都是值传递, 需要考虑内存拷贝的代价,设计合理的参数类型:

  • 对于输入参数,拷贝代价小的类型使用值传递,拷贝代价大的类型传递只读引用。
  • 对于返回类型,如果拷贝代价大,宜设计传递可写借用参数并返回它。

【反例】

输入参数

Rust
// 不符合
fn func(val: [i32; 1000]);

【正例】

输入参数

Rust
// 符合
fn func(val: &[i32]);

【反例】

返回类型

Rust
// 不符合:后续Self类型功能扩展,很可能导致栈内存拷贝代价增大
fn set_property(self, name: &str, value: &str) -> Self;

【正例】

返回类型

Rust
// 符合:传递可写借用参数并返回它,适合链式调用的场景
fn set_property(&mut self, name: &str, value: &str) -> &mut Self;