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中那样在堆上单独分配它们?
我会画一张图 . 第一个值是指向堆上连续数字数组的指针 .
(stack) (heap) ┌──────┐ ┌───┐ │ vec1 │──→│ 1 │ └──────┘ ├───┤ │ 2 │ ├───┤ │ 3 │ ├───┤ │ 4 │ └───┘
第二个版本增加了额外的间接性 . 元素仍然在堆上,但现在它们在堆上的其他位置 .
(stack) (heap) ┌───┐ ┌──────┐ ┌───┐ ┌─→│ 1 │ │ vec2 │──→│ │─┘ └───┘ └──────┘ ├───┤ ┌───┐ │ │───→│ 2 │ ├───┤ └───┘ │ │─┐ ┌───┐ ├───┤ └─→│ 3 │ │ │─┐ └───┘ └───┘ │ ┌───┐ └─→│ 4 │ └───┘
由于所有权在Rust中的运行方式,您不会遇到任何语义差异 . 额外的间接为您提供更糟糕的内存使用和缓存局部性 .
vec![1, 2, 3, 4] 是 i32 的向量 .
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 .
vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)]
2 回答
我会画一张图 . 第一个值是指向堆上连续数字数组的指针 .
第二个版本增加了额外的间接性 . 元素仍然在堆上,但现在它们在堆上的其他位置 .
由于所有权在Rust中的运行方式,您不会遇到任何语义差异 . 额外的间接为您提供更糟糕的内存使用和缓存局部性 .
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 .