Referenzen
Speichergröße von Referenzen
Abschnitt betitelt „Speichergröße von Referenzen“Betrachten Sie die Variablen s2 und s3 im folgenden Programm. Diese beiden Variablen befinden sich im Speicher innerhalb des Stack-Frames für main . Jede Variable hat eine Größe im Speicher auf dem Stack, nicht einschließlich der Größe der referenzierten Daten. Welche Aussage trifft auf die Größen von s2 und s3 zu?
fn main() { let s = String::from("hello"); let s2: &String = &s; let s3: &str = &s[..];}Der Typ &String ist eine normale Referenz, die aus einem einzelnen Zeiger besteht, also 8 Bytes auf einer 64-Bit-Architektur. Der Typ &str ist eine spezielle Slice-Referenz, die aus einem Zeiger und einer Länge besteht, also 16 Bytes. Daher verwendet s3 vom Typ &str mehr Speicher als s2 vom Typ &String . Sie können dies selbst mit std::mem::size_of überprüfen, wie folgt:
fn main() { println!( "&String={} &str={}", std::mem::size_of::<&String>(), std::mem::size_of::<&str>(), );}Beachten Sie auch, dass Rust String-Referenzen implizit entweder in &String oder &str umwandelt, basierend auf dem Kontext der Referenz. Der Ausdruck &s erzeugt also zwei verschiedene Werte, basierend auf dem erwarteten Typ von &s .
Mutable Borrowing Fehler
Abschnitt betitelt „Mutable Borrowing Fehler“fn main() { let mut s = String::from("hello"); for &item in s.as_bytes().iter() { if item == b'l' { s.push_str(" world"); } } println!("{s}");}Da s.as_bytes() eine unveränderliche Referenz auf s erzeugt, ist es nicht erlaubt, s (mittels push_str ) innerhalb der For-Schleife zu verändern.