Zum Inhalt springen

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 .


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.