gpt4 book ai didi

reference - 传递可变引用总是比创建和返回拥有的值更可取吗?

转载 作者:行者123 更新时间:2023-11-29 08:10:15 25 4
gpt4 key购买 nike

从像 Python 这样的动态语言转到 Rust,我不习惯这样的编程模式,在这种模式中,您提供一个函数,该函数具有对空数据结构的可变引用,然后由该函数填充它。一个典型的例子是将文件读入 String:

let mut f = File::open("file.txt").unwrap();
let mut contents = String::new();
f.read_to_string(&mut contents).unwrap();

在我习惯 Python 的眼中,一个 API,您只需在函数中创建一个拥有的值并将其作为返回值移出看起来更直观/符合人体工程学/你有什么:

let mut f = File::open("file.txt").unwrap();
let contents = f.read_to_string().unwrap();

既然 Rust 标准库走的是前者的道路,我想一定是有原因的。

使用引用模式总是更可取吗?如果是这样,为什么? (性能原因?具体是什么?)如果不是,我如何发现它可能有益的情况?除了填充结果数据结构(如上面的第一个示例,其中 .read_to_string() 返回读取的字节数)之外,当我还想返回另一个值时,它是否最有用?为什么不使用元组?这仅仅是个人喜好问题吗?

最佳答案

如果 read_to_string 想要返回一个拥有的 String,这意味着每次调用它都必须在堆上分配一个新的 String。此外,由于 Read 实现并不总是知道有多少数据要读取,因此它可能必须以增量方式重新分配正在进行的工作 String 多个次。这也意味着每个临时 String 都必须返回到分配器才能被销毁。

这是浪费。 Rust 是一种系统编程语言。系统编程语言厌恶浪费。

相反,调用者负责分配和提供缓冲区。如果您只调用一次 read_to_string,则什么都不会改变。但是,如果您多次 调用它,则可以多次重复使用同一个缓冲区,而无需常量分配/调整大小/解除分配循环。虽然它不适用于这种特定情况,但可以设计类似的接口(interface)来支持堆栈缓冲区,这意味着在某些情况下您可以完全避免堆事件。

让调用者传入缓冲区比替代方案更灵活。

关于reference - 传递可变引用总是比创建和返回拥有的值更可取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45756582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com