Wie weiß der Rust-Compiler, ob ein Wert verschoben wurde oder nicht?

8

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") ?

    
yyyy 14.01.2016, 08:18
quelle

1 Antwort

9

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:

  1. Identifizieren von unbedingten Drops (diese benötigen keine Laufzeitprüfung)
  2. Speichern Sie ein verborgenes Feld im Stapel im Funktionsrahmen, damit diese Werte bedingt gelöscht werden

Diese neue Strategie hat mehrere Vorteile gegenüber der alten:

  • Der Hauptvorteil ist, dass #[repr(C)] jetzt immer eine Repräsentation liefert, die der von C entspricht, auch wenn struct implementiert Drop
  • Ein weiterer wichtiger Vorteil ist das Speichern von Speicher (indem Sie die struct size NICHT aufblasen)
  • Ein weiterer kleiner Vorteil ist eine mögliche leichte Geschwindigkeitszunahme aufgrund von unbedingten Stürzen und besserem Caching (durch Reduzierung der Speichergröße)
Matthieu M. 14.01.2016, 08:41
quelle

Tags und Links