【问题标题】:What is the difference between Vec<i32> and Vec<Box<i32>>?Vec<i32> 和 Vec<Box<i32>> 有什么区别?
【发布时间】:2014-01-11 18:23:15
【问题描述】:
let vec1 = vec![1, 2, 3, 4];
let vec2 = vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)];

它们之间有什么区别? 我已经在堆上分配了 vec1。那么vec1的所有元素不是也在堆上吗?为什么我需要像在 vec2 中那样在堆上单独分配它们?

【问题讨论】:

  • 这里不是 rust 专家,但我认为区别在于 1 是值 1,而 ~1 是指向 1 的拥有指针。所以在 vec2 你只是得到多一层间接

标签: rust


【解决方案1】:

我会画一张图。第一个值是指向堆上连续数字数组的指针。

(堆) (堆) ┌──────┐ ┌────┐ │ vec1 │──→│ 1 │ └──────┘ ├────┤ │ 2 │ ├────┤ │ 3 │ ├────┤ │ 4 │ └────┘

第二个版本增加了额外的间接性。元素仍在堆上,但现在它们在堆上其他地方

(栈) (堆) ┌───┐ ┌──────┐ ┌────┐ ┌─→│ 1 │ │ vec2 │──→│ │─┘ └───┘ └──────┘ ├────┤ ┌────┐ │ │────→│ 2 │ ├────┤ └────┘ │ │─┐ ┌───┐ ├───┤ └─→│ 3 │ │ │─┐ └───┘ └────┘ │ ┌────┐ └─→│ 4 │ └────┘

由于所有权在 Rust 中的工作方式,您不会遇到任何语义差异。额外的间接性会给您带来更糟糕的内存使用和缓存局部性。

【讨论】:

  • 这真是一张令人印象深刻的图表。你用了多长时间才打字?
  • 不是很长,我只是复制和粘贴方框图字符。
【解决方案2】:

vec![1, 2, 3, 4]i32s 的向量。

vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)] 是指向i32s 的拥有指针的向量。 Rust 的自有指针类似于 C++ 的 unique_ptr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多