Ein einfaches Beispiel:
%Vor%Wenn ich es ausführe, ist die Ausgabe:
%Vor% Ich verstehe im Fall test(2)
, a
wird um us(a)
verschoben, daher lautet die Ausgabe "test-use-drop-end".
In test(1)
ist die Ausgabe jedoch "test-end-drop", was bedeutet, dass der Compiler weiß, dass a
nicht verschoben wurde.
Wenn us(a)
aufgerufen wird, ist es nicht notwendig, a
in test(i)
zu löschen, sondern in us(a)
; und wenn us(a)
nicht aufgerufen wird, muss a
nach println!("end")
gelöscht werden.
Da der Compiler nicht wissen kann, ob us(a)
aufgerufen wurde oder nicht, wie weiß der Compiler, ob a.drop()
aufgerufen werden soll oder nicht, nachdem println!("end")
?
Dies wird im Rustnomicon erklärt:
Ab Rust 1.0 werden die Drop-Flags nicht mehr so geheim in einem versteckten Feld eines beliebigen Typs gespeichert, der Drop implementiert.
Das verborgene Feld gibt an, ob der aktuelle Wert gelöscht wurde oder nicht, und wenn dies nicht der Fall ist. Daher ist dies zur Laufzeit bekannt und erfordert ein bisschen Buchhaltung.
Mit Blick auf die Zukunft gibt es eine RFC zu entfernen diese versteckten Felder .
Die Idee des RFC ist, die versteckten Felder zu ersetzen durch:
Diese neue Strategie hat mehrere Vorteile gegenüber der alten:
#[repr(C)]
jetzt immer eine Repräsentation liefert, die der von C entspricht, auch wenn struct
implementiert Drop
struct
size NICHT aufblasen) Tags und Links rust