rust - rust 究竟如何处理返回值

标签 rust runtime

我对我的代码有疑问:

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 (via Vec::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对缓冲区的引用(StringVec<u8> 说),
  • 或者按值获取缓冲区并返回它。

重点是避免内存分配。

关于rust - rust 究竟如何处理返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49510471/

相关文章:

rust - 如何访问特征的默认方法定义中的结构字段?

windows - Eclipse W10 Rust 配置 "RLS"

java - 使用java运行时将jar文件提取到特定路径

Angular 延迟加载位于不同环境中的同级应用程序。

java - 在java进程构建器中使用stdin "<"

rust - 为什么最后一个特定于平台的依赖项在 Cargo 中优先?

rust - 如何在 HashMap 字段中保存对处理程序的引用

mongodb - "The trait bound ` Bson : From<u128> ` is not satisfied" error when using the doc! 具有 u128 属性的宏

java - 如何从嵌入式 Jython 中调用 java 函数?

java - 线程 Java 中断