Follow-up von Warum nicht? Weak :: new () funktioniert, wenn Rc :: downgrade () tut?
Wenn ich versuche, Weak::new()
so zu implementieren, dass es keinen Speicher für den zugrunde liegenden Typ reservieren muss, obwohl es nie benutzt wird, treffe ich einen Roadblock.
Die Definition von RcBox<T>
ist ziemlich einfach:
Und das Ziel ist hier, eine RcBox<T>
zu erstellen, die tatsächlich KEIN value
enthält. Im Wesentlichen ein RcBox<()>
.
Allerdings gibt es einen Haken. *mut RcBox<()>
ist ein dünner Zeiger, aber *mut RcBox<T>
ist möglicherweise ein dicker Zeiger. Wir haben den Datenteil dieses dicken Zeigers richtig, aber es gibt viele verschiedene Fälle von fetten Zeigern, daher ist der Versuch, den Rest zu synthetisieren, schwer .
Wie man in der verknüpften Frage sehen kann, kann ich es für nur Merkmalsobjekte funktionieren lassen:
%Vor% Dies funktioniert jedoch nicht mit str
(zum Beispiel).
Ich habe einen weiteren Versuch unternommen, den Anteil fester Größe von RcBox
zu isolieren, während der Compiler auf den Fettteil des Zeigers schließen darf:
was sehr schlau klingt, bis der Compiler Ihre Begeisterung zerquetscht:
%Vor%
Das ist:
PhantomData
in RcBoxCounters
, Also, gibt es eine Möglichkeit, Weak::new()
zu reparieren, so dass es aufhört, überflüssigen (unnötigen) Speicher zuzuweisen?
Hinweis: Ich meine, dass nur Platz für die beiden Zähler reserviert wird, das Zuweisen von großen und das anschließende Trimmen hilft NICHT.
Hinweis: Es wurde angemerkt, dass man einen Option
oder einen speziellen Wert verwenden könnte, um die Abwesenheit von Werten zu bezeichnen. Dies erfordert eine Verzweigung für jede Methode, die möglicherweise nicht wünschenswert ist. Ich bevorzuge es, mit dicken Zeigern herumzuspielen.
Tags und Links rust