Memory 在引擎盖下,锈菌中的向量是通过引用还是通过值返回的?

Memory 在引擎盖下,锈菌中的向量是通过引用还是通过值返回的?,memory,rust,Memory,Rust,我正在努力学习锈迹中记忆的来龙去脉。在函数中创建向量并返回时,是返回引用还是复制整个向量 例如: use std::io; fn line_to_ints() -> Vec<u32> { let mut line = String::new(); io::stdin() .read_line(&mut line) .expect("Failed to read line"); return line

我正在努力学习锈迹中记忆的来龙去脉。在函数中创建向量并返回时,是返回引用还是复制整个向量

例如:

use std::io;

fn line_to_ints() -> Vec<u32> {
    let mut line = String::new();

    io::stdin()
        .read_line(&mut line)
        .expect("Failed to read line");

    return line
        .split(" ")
        .map(|x| x.parse().expect("Not an integer!"))
        .collect();
}
使用std::io;
fn行到整数()->Vec{
让mut line=String::new();
io::stdin()
.read_行(&mut行)
.expect(“读取行失败”);
回程线
.拆分(“”)
.map(|x | x.parse().expect(“不是整数!”)
.收集();
}
对于所有其他非基本数据类型,此处的返回行为是否也相同

与之不同的是,我想知道更多关于引擎盖下发生的事情。这个问题的答案并没有明确说明是否创建了向量并将其复制到一个新位置,或者是否返回了指针的所有权。我知道向量是在堆上创建的,所以我认为涉及到指针

是否返回了引用

不可能,因为一旦函数结束,就没有可引用的内容。这将在中详细介绍

是否复制了整个向量

是的,但可能不是你的意思。
Vec
基本上定义为

struct Vec<T> {
    capacity: usize,
    length: usize,
    data: *mut T,
}
结构向量{ 容量:usize, 长度:usize, 数据:*mut T, } 语义上,这3个指针大小的字段从函数移动到调用方。不复制向量包含的N个元素

在实现方面,编译器/优化器可以从大量技巧中挑选:

  • 实际上,复制所有三个字段
  • 传入一个秘密可变引用,并让函数直接写入该引用
  • 内联调用它的函数
  • 执行死代码删除,并且一开始决不调用该函数
  • 也许其他人
知道它选择哪个的唯一方法是查看MIR/LLVM IR/assembly

对于所有其他非基本数据类型,此处的返回行为是否也相同

对。Rust的数据类型都被同等对待。原语与非原语对语言的语义来说毫无意义

另见:


惯用Rust不会在块末尾使用
return
关键字。取而代之的是,您去掉了
返回
和分号。“是返回了引用还是复制了整个向量?”,这取决于您所说的整个向量的含义,您的函数创建了一个向量,并将所有权赋予调用方,这是一个移动,不用担心,这应该很好,没有任何性能问题。问题更新谢谢您的解释。我可以通过这些额外的信息理解相关的问题。