- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对我的代码有疑问:
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 究竟是如何处理返回值的?例如,当我写 let signals = get_signal(&"data.csv".to_string());
时,Rust 是否假设我想要一个新的 Vec 实例(复制所有数据)或者只是传递一个指向先前分配的(通过 Vec::new()
)内存的指针?最有效的方法是什么?另外,rdr
会怎样?我假设,鉴于 Rusts 内存安全,它已被破坏。
最佳答案
How exactly does Rust handle return?
Rust 这种语言的唯一保证是,如果没有明确的 .clone()
,值永远不会克隆在代码中。因此,从语义的角度来看,该值被移动,不需要分配内存。
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(应用程序二进制接口(interface))的一部分。 Rust ABI 未正式化,不稳定,因此没有描述它的标准,也无法保证这种支持。
此外,这将取决于函数调用是内联还是不是。如果函数调用是内联的,当然没有return
应该观察到相同的行为。
对于小值,它们应该通过一个寄存器(或几个寄存器)返回。
对于较大的值:
注意:此处的大小是堆栈上的大小,由 std::mem::size_of
返回;所以size_of::<Vec<_>>() == 24
在 64 位架构上。
What is the most efficient way to do this?
单次调用返回的效率与返回的效率一样。
但是,如果您发现自己处于一种情况,比方说,您想逐行读取一个文件,那么重用从一个调用到另一个调用的缓冲区是有意义的,这是可以实现的通过:
&mut
对缓冲区的引用(String
或 Vec<u8>
说),重点是避免内存分配。
关于rust - rust 究竟如何处理返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49510471/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!