Vec <i32>和Vec <box <i32>&gt;有什么区别?</box <i32> </i32>

时间:2014-01-11 18:23:16

标签: rust

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 个答案:

答案 0 :(得分:29)

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

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

第二个版本增加了é¢å¤–的间接性。元素ä»ç„¶åœ¨å †ä¸Šï¼Œä½†çŽ°åœ¨å®ƒä»¬åœ¨å †ä¸Šçš„其他地方。

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

由于所有æƒåœ¨Rust中的è¿è¡Œæ–¹å¼ï¼Œæ‚¨ä¸ä¼šé‡åˆ°ä»»ä½•è¯­ä¹‰å·®å¼‚。é¢å¤–的间接性会给你带æ¥æ›´ç³Ÿçš„内存使用和缓存局部性。

答案 1 :(得分:4)

vec![1, 2, 3, 4]是i32 sçš„å‘é‡ã€‚

vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)]是i32 s拥有指针的å‘é‡ã€‚ Rust拥有的指针类似于C ++çš„unique_ptr。