【问题标题】:Rust: Create New Vector Containing Elements Of Existing Vector With Minimal New Memory AllocationRust:以最少的新内存分配创建包含现有向量元素的新向量
【发布时间】:2020-12-30 21:47:11
【问题描述】:

我开始学习 Rust,这是我第一次使用一种你必须考虑内存分配的语言(我从未使用过 C)。

作为一个练习,我决定看看如何创建一个新向量,其中包含来自另一个向量的一些元素以及一些新元素。我的目标是创建一个向量来维护指向另一个向量中数据的指针,而不是复制或克隆该数据,以便仅为其他元素分配新内存。这是下面代码中发生的事情,和/或有更好的方法来做我想做的事情吗?

fn main() {
    let v = vec![vec![1], vec![2], vec![3]];
    let v0 = &v[0];
    let v1 = &v[1];
    let v2 = &vec![4];
    let v3 = vec![v0, v1, v2];
}

我使用嵌套向量是因为对我来说,当您在堆上处理数据时,这个问题比在堆栈上更相关,并且当整数在堆栈上时,向量是在堆上分配的,但请记住我是整个领域的新手,如果我所说的和所做的完全没有意义,请随时告诉我????。

【问题讨论】:

  • 是的,就是这样——v3 是三个向量引用的向量。问题是它没有你希望的那么有用,因为你已经共享了对所有这些向量的引用,你不再被允许修改它们。
  • 谢谢,你关于突变的观点很好。来自功能背景,这有助于我通过翻译成我更熟悉的成语来理解内存分配的工作原理,但我知道成语的 Rust 更多地依赖于突变。无论如何,有没有更好或更惯用的方法来完成我的代码完成的同样事情?
  • 这是问题的一部分:我不确定您要完成什么。我的意思是,从字面上看,这很清楚,我想这就是你的做法,但我不明白这有什么用,或者你想要完成什么。您的问题将通过提供一个用例或至少提供这样做的动机来解决。
  • 这可以在 Rust 中完成,参见例如this crate,但这远非简单而且绝对不是一个学习项目。我什至建议你暂时忘记 clojure 风格的内存管理方法,并尝试学习 Rust 的做事方式。如果你只是想了解 Rust 中的借用检查器和内存操作,我建议this nice book
  • 看那本书,它看起来就像是为我写的!谢谢!

标签: rust


【解决方案1】:

我的目标是创建一个向量来维护指向另一个向量中数据的指针,而不是复制或克隆该数据,以便仅为其他元素分配新内存。这是下面代码中发生的事情吗[?]

是的,v3 包含对 v 中现有向量的引用。它不会创建新的或任何东西。

当您在堆上处理数据而不是在堆栈上处理数据时,这个问题更相关,并且当整数在堆栈上时,向量被分配在堆上

这句话并不是真的,尽管在处理此类问题时使用非 Copy 类型确实可以避免自欺欺人。值是在堆栈上、堆上还是不在任何一个上都由 Rust 决定; vec![vec![1]]vec![1] 的值在最外层 vec 内的值与堆上的值一样多,如果我们猜测 Rust 会做什么。

【讨论】:

  • 谢谢!我有一个相关的问题,希望不会太离题,但是当您获取向量的一部分时,编译器希望所有嵌套类型都实现克隆,这向我表明切片会自动克隆。那么我的方法是否也可能是一种无需克隆即可制作逻辑切片的方法?
  • @grandinero 当你取一个向量的切片时,编译器希望所有嵌套类型都实现克隆 - 你为什么这么认为?这是not true
  • 你说得对,我刚刚意识到我在切片上调用了.to_vec,那是在克隆内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多