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

sun*_*304 10 rust

let vec1 = vec![1, 2, 3, 4];
let vec2 = vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)];
Run Code Online (Sandbox Code Playgroud)

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

Die*_*Epp 29

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

(stack)    (heap)
????????   ?????
? vec1 ????? 1 ?
????????   ?????
           ? 2 ?
           ?????
           ? 3 ?
           ?????
           ? 4 ?
           ?????

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

(stack)    (heap)   ?????
????????   ????? ???? 1 ?
? vec2 ?????   ???  ?????
????????   ?????    ?????
           ?   ?????? 2 ?
           ?????    ?????
           ?   ???  ?????
           ????? ???? 3 ?
           ?   ???  ?????
           ????? ?  ?????
                 ???? 4 ?
                    ?????

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

  • 这是一个非常令人印象深刻的图表.输入它需要多长时间? (6认同)
  • 不是很长,我只是复制并粘贴盒子绘图字符. (4认同)