我想知道作为参数的函数之间是否有任何区别(在优化方面):
fn thing(a: &Option<T>)
Run Code Online (Sandbox Code Playgroud)
与以参数为参数的函数相比:
fn thing(a: Option<&T>)
Run Code Online (Sandbox Code Playgroud)
kmd*_*eko 11
使用Option<&T>
正如评论中所述,Option<&T>
与 的大小相同&T
,因此它们在调用约定方面没有真正的区别。它&Option<T>
有一个轻微的成本,你被迫遵循间接才能匹配值,但我不会认真考虑一个与另一个的原因,除非在最可怕的情况下。
然而,最大的区别是&Option<T>
存在人体工程学问题。考虑以下情况:我T
想将 a 传递给此函数:
let t: T = ...;
thing(&Some(T));
Run Code Online (Sandbox Code Playgroud)
这还不错,但是如果我想t
以后使用我的怎么办?我不能使用上面的代码,因为它被移动以便使Option<T>
. 我将被迫做这样的事情:
let t: T = ...;
let opt_t = Some(t);
thing(&opt_t );
let t = opt_t.unwrap();
Run Code Online (Sandbox Code Playgroud)
这不太好。即使我之后不想使用它,移动变量本身也可能会产生不可忽略的成本。争论Option<&T>
就不会有这些问题。