¿Cuál es la diferencia entre VEC y VEC >?
-
26-12-2019 - |
Pregunta
let vec1 = vec![1, 2, 3, 4];
let vec2 = vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)];
¿Cuál es la diferencia entre ellos? Ya he asignado VEC1 en el montón.¿Así que no son todos los elementos de VEC1 también en el montón?¿Por qué necesitaría asignarlos por separado en el montón como en VEC2?
Solución
Dibujaré un diagrama.El primer valor es un puntero a una matriz contigua de números en el montón.
(stack) (heap) ┌──────┐ ┌───┐ │ vec1 │──→│ 1 │ └──────┘ ├───┤ │ 2 │ ├───┤ │ 3 │ ├───┤ │ 4 │ └───┘
La segunda versión agrega indirección adicional.Los elementos todavía están en el montón, pero ahora son en otro lugar en el montón.
(stack) (heap) ┌───┐ ┌──────┐ ┌───┐ ┌─→│ 1 │ │ vec2 │──→│ │─┘ └───┘ └──────┘ ├───┤ ┌───┐ │ │───→│ 2 │ ├───┤ └───┘ │ │─┐ ┌───┐ ├───┤ └─→│ 3 │ │ │─┐ └───┘ └───┘ │ ┌───┐ └─→│ 4 │ └───┘
Debido a la forma en que funciona la propiedad en Rust, no se va a encontrar en ninguna diferencia semántica.La indirección adicional le brinda peor uso de memoria y localidad de caché.
Otros consejos
vec![1, 2, 3, 4]
es un vector de i32
s.
vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)]
es un vector de punteros de propiedad de i32
s.El puntero de su propiedad de Rust es similar al único_ptr.