2015-09-14 11 views
5

Rust fornisce alcuni modi per memorizzare una raccolta di elementi all'interno di una struttura definita dall'utente. La struct può essere assegnato un identificatore di vita personalizzato, e un riferimento a una fetta:Qual è la differenza tra la memorizzazione di un Vec vs un Slice?

struct Foo<'a> { 
    elements: &'a [i32] 
} 

impl<'a> Foo<'a> { 
    fn new(elements: &'a [i32]) -> Foo<'a> { 
     Foo { elements: elements } 
    } 
} 

Oppure può essere dato un oggetto Vec:

struct Bar { 
    elements: Vec<i32> 
} 

impl Bar { 
    fn new(elements: Vec<i32>) -> Bar { 
     Bar { elements: elements } 
    } 
} 

Quali sono le principali differenze tra questi due approcci?

  • L'utilizzo di Vec imporrà la lingua per copiare la memoria ogni volta che si chiama Bar::new(vec![1, 2, 3, 4, 5])?
  • Il contenuto di Vec verrà distrutto in modo implicito quando il proprietario Bar non sarà più disponibile?
  • Ci sono pericoli associati al passaggio di una sezione per riferimento se è utilizzata al di fuori della struttura a cui viene passata?

risposta

10

Un Vec si compone di tre parti:

  1. Un puntatore a un blocco di memoria
  2. Un conteggio di quantità di memoria allocata (la capacità)
  3. Un conteggio quanti articoli sono memorizzati (la dimensione )

Una fetta è composta da due parti:

  1. Un puntatore ad un pezzo di memoria
  2. Un conteggio di quanti articoli sono memorizzati (la dimensione )

Ogni volta che ci si sposta uno dei questi, questi campi sono tutto ciò che verrà copiato. Come puoi immaginare, è piuttosto leggero. Il blocco effettivo della memoria sull'heap non verrà copiato o spostato.

A Vec indica la proprietà della memoria e una sezione indica un prestito di memoria. A Vec è necessario deallocare tutti gli elementi e il blocco di memoria quando è stato deallocato (eliminato in Rust-speak). Questo succede quando esce dal campo di applicazione. La fetta non fa nulla quando viene rilasciata.

Non ci sono pericoli nell'utilizzo di fette, in quanto questo è ciò che Rust gestisce di durata. In questo modo, assicurati di non utilizzare un riferimento dopo che sarà stato invalidato.

+0

La suddivisione di ciò di cui ogni tipo è composto è molto elucidante. – KChaloux

Problemi correlati