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中的工作方式,您不会遇到任何语义差异.额外的间接为您提供更糟糕的内存使用和缓存局部性.
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |