Rust 究竟如何处理 return 值
How does exactly rust handle return values
我对我的代码有疑问:
pub fn get_signals(path: &String) -> Vec<Vec<f64>> {
let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_path(&path).unwrap();
let mut signals: Vec<Vec<f64>> = Vec::new();
for record in rdr.records(){
let mut r = record.unwrap();
for (i, value) in r.iter().enumerate(){
match signals.get(i){
Some(_) => {},
None => signals.push(Vec::new())
}
signals[i].push(value.parse::<f64>().unwrap());
}
}
signals
}
Rust 究竟如何处理 return?例如,当我写 let signals = get_signal(&"data.csv".to_string());
时,Rust 是否假设我想要一个新的 Vec 实例(复制所有数据)或只是传递一个指向先前分配的(通过 Vec::new()
)内存的指针?最有效的方法是什么?另外,rdr
会发生什么?我假设,鉴于 Rusts 内存安全,它已被破坏。
How exactly does Rust handle return?
Rust 这种语言所做的唯一保证是,如果代码中没有明确的 .clone()
,值永远不会 克隆 。因此,从语义的角度来看,该值是moved,不需要分配内存。
does Rust assume I want a new instance of Vec
(copies all the data) or just pass a pointer to previously allocated (via Vec::new()
) memory?
这是特定于实现的,并且是 ABI(应用程序二进制接口)的一部分。 Rust ABI 不是形式化的,不是稳定的,所以没有描述它的标准,也不能保证这种支持。
此外,这将取决于函数调用是内联还是非。如果函数调用是内联的,当然不再有 return
,但应该观察到相同的行为。
对于小值,它们应该通过一个寄存器(或几个寄存器)return编辑。
对于较大的值:
- 调用者应在堆栈上保留内存(适当大小和对齐)并将指向此区域的指针传递给被调用者,
- 然后被调用者将在指向的地方构造 return 值,这样当它 returns 时该值已经存在供调用者使用。
注意:这里的大小是堆栈上的大小,由std::mem::size_of
编辑return;所以 size_of::<Vec<_>>() == 24
在 64 位架构上。
What is the most efficient way to do this?
对于单次调用,返回与获取一样高效。
但是,如果您发现自己处于一种情况,比方说,您想逐行读取一个文件,那么重用一次调用缓冲区是有意义的其他可以通过以下方式完成:
- 对缓冲区进行
&mut
引用(String
或 Vec<u8>
),
- 或按值获取缓冲区并return处理它。
重点是避免内存分配。
我对我的代码有疑问:
pub fn get_signals(path: &String) -> Vec<Vec<f64>> {
let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_path(&path).unwrap();
let mut signals: Vec<Vec<f64>> = Vec::new();
for record in rdr.records(){
let mut r = record.unwrap();
for (i, value) in r.iter().enumerate(){
match signals.get(i){
Some(_) => {},
None => signals.push(Vec::new())
}
signals[i].push(value.parse::<f64>().unwrap());
}
}
signals
}
Rust 究竟如何处理 return?例如,当我写 let signals = get_signal(&"data.csv".to_string());
时,Rust 是否假设我想要一个新的 Vec 实例(复制所有数据)或只是传递一个指向先前分配的(通过 Vec::new()
)内存的指针?最有效的方法是什么?另外,rdr
会发生什么?我假设,鉴于 Rusts 内存安全,它已被破坏。
How exactly does Rust handle return?
Rust 这种语言所做的唯一保证是,如果代码中没有明确的 .clone()
,值永远不会 克隆 。因此,从语义的角度来看,该值是moved,不需要分配内存。
does Rust assume I want a new instance of
Vec
(copies all the data) or just pass a pointer to previously allocated (viaVec::new()
) memory?
这是特定于实现的,并且是 ABI(应用程序二进制接口)的一部分。 Rust ABI 不是形式化的,不是稳定的,所以没有描述它的标准,也不能保证这种支持。
此外,这将取决于函数调用是内联还是非。如果函数调用是内联的,当然不再有 return
,但应该观察到相同的行为。
对于小值,它们应该通过一个寄存器(或几个寄存器)return编辑。
对于较大的值:
- 调用者应在堆栈上保留内存(适当大小和对齐)并将指向此区域的指针传递给被调用者,
- 然后被调用者将在指向的地方构造 return 值,这样当它 returns 时该值已经存在供调用者使用。
注意:这里的大小是堆栈上的大小,由std::mem::size_of
编辑return;所以 size_of::<Vec<_>>() == 24
在 64 位架构上。
What is the most efficient way to do this?
对于单次调用,返回与获取一样高效。
但是,如果您发现自己处于一种情况,比方说,您想逐行读取一个文件,那么重用一次调用缓冲区是有意义的其他可以通过以下方式完成:
- 对缓冲区进行
&mut
引用(String
或Vec<u8>
), - 或按值获取缓冲区并return处理它。
重点是避免内存分配。