我正在努力学习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)
对于所有其他非原始数据类型,此处的返回行为是否也相同?
与是否有任何方法可以返回对函数中创建的变量的引用?,我想更多地了解引擎盖下发生的事情.该问题的答案并没有提供关于是否创建向量然后将其复制到新位置的清晰度,或者返回指针的所有权我知道向量是在堆上创建的,所以我想象一个指针.
是返回的引用
不可以.因为一旦功能结束就没有什么可以参考的了.这有详细介绍有没有办法返回对函数中创建的变量的引用?.
是复制的整个矢量
是的,但可能不是你的意思.阿Vec
被基本上定义为
struct Vec<T> {
capacity: usize,
length: usize,
data: *mut T,
}
Run Code Online (Sandbox Code Playgroud)
从语义上讲,这3个指针大小的字段从函数移动到调用者.不复制向量包含的N个元素.
在实现方面,编译器/优化器可以从一大堆技巧中挑选:
知道它选择的唯一方法是查看MIR/LLVM IR /汇编.
对于所有其他非原始数据类型,此处的返回行为是否也相同?
是.Rust的数据类型都被视为相同.原始与非原始对于语言的语义没有任何意义.
也可以看看:
归档时间: |
|
查看次数: |
272 次 |
最近记录: |