Kann Rust eines Tages die bitweise Kopie während des Verschiebens eines Objekts optimieren?
Betrachten Sie das Snippet
struct Foo {
dummy: [u8; 65536],
}
fn bar(foo: Foo) {
println!("{:p}", &foo)
}
fn main() {
let o = Foo { dummy: [42u8; 65536] };
println!("{:p}", &o);
bar(o);
}
in typischesErgebni des Programms ist
0x7fffc1239890
0x7fffc1229890
wo die Adressen unterschiedlich sind.
Anscheinend das große Arraydummy
wurde wie erwartet in die move-Implementierung des Compilers kopiert. Leider kann dies nicht unbedeutende Auswirkungen auf die Leistung haben, dadummy
ist ein sehr großes Array. Diese Auswirkung kann dazu führen, dass Personen stattdessen die Übergabe von Argumenten als Referenz wählen, selbst wenn die Funktion das Argument tatsächlich konzeptionell "verbraucht".
Schon seitFoo
leitet nicht abCopy
, Objekto
ist verschoben. Da Rust den Zugang von bewegten Objekten verbietet, was verhindertbar
um das ursprüngliche Objekt "wiederzuverwenden"o
, um den Compiler zu zwingen, eine potenziell teure bitweise Kopie zu erstellen? Gibt es eine grundlegende Schwierigkeit, oder wird der Compiler eines Tages diese bitweise Kopie optimieren?