参考选项与参考选项

Dav*_*ong 6 rust

我想知道作为参数的函数之间是否有任何区别(在优化方面):

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>就不会有这些问题。

  • 作为反驳,很多时候你会得到 `&amp;Option&lt;T&gt;` (通常是因为泛型),并且转换它需要一些成本。不过我同意你的推理。 (2认同)