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 次 |
最近记录: |