首页 文章

Vec <i32>和Vec <Box <i32 >>有什么区别?

提问于
浏览
10
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中那样在堆上单独分配它们?

2 回答

  • 29

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

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

    第二个版本增加了额外的间接性 . 元素仍然在堆上,但现在它们在堆上的其他位置 .

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

    由于所有权在Rust中的运行方式,您不会遇到任何语义差异 . 额外的间接为您提供更糟糕的内存使用和缓存局部性 .

  • 4

    vec![1, 2, 3, 4]i32 的向量 .

    vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)] 是一个拥有指向 i32 的指针的向量 . Rust 's owned pointer is similar to C++' s unique_ptr .

相关问题