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?

¿Fue útil?

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 i32s.

vec![Box::new(1), Box::new(2), Box::new(3), Box::new(4)] es un vector de punteros de propiedad de i32s.El puntero de su propiedad de Rust es similar al único_ptr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top