在引擎盖下,Rust中的向量是通过引用或值返回的吗?

tni*_*les 2 memory rust

我正在努力学习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
        .split(" ")
        .map(|x| x.parse().expect("Not an integer!"))
        .collect();
}
Run Code Online (Sandbox Code Playgroud)

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

是否有任何方法可以返回对函数中创建的变量的引用?,我想更多地了解引擎盖下发生的事情.该问题的答案并没有提供关于是否创建向量然后将其复制到新位置的清晰度,或者返回指针的所有权我知道向量是在堆上创建的,所以我想象一个指针.

She*_*ter 7

是返回的引用

不可以.因为一旦功能结束就没有什么可以参考的了.这有详细介绍有没有办法返回对函数中创建的变量的引用?.

是复制的整个矢量

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

struct Vec<T> {
    capacity: usize,
    length: usize,
    data: *mut T,
}
Run Code Online (Sandbox Code Playgroud)

从语义上讲,这3个指针大小的字段从函数移动到调用者.不复制向量包含的N个元素.

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

  • 实际上复制所有三个字段
  • 传入一个秘密的可变引用并让函数直接写入它
  • 内联调用它的函数
  • 执行死代码删除,从不首先调用该函数
  • 可能是其他人......

知道它选择的唯一方法是查看MIR/LLVM IR /汇编.

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

是.Rust的数据类型都被视为相同.原始与非原始对于语言的语义没有任何意义.

也可以看看: