Erstellen eines Referenzobjekts in D mit RefCounted! (T)

8

Wie benutzt man std.typecons.RefCounted!(T) , um ein Referenzobjekt in D zu erstellen?

Ich habe versucht herauszufinden, was std.array.Array intern macht, indem ich die Quelle anschaue, aber während ich die Quelle lesen kann, kann ich einfach nicht herausfinden, was eine "Nutzlast" ist oder wie alles funktioniert, wenn es Dinge gibt wie bitweises Struct-Copying beteiligt, sowie warum einige Dinge in der internen und externen Struktur dupliziert werden.

Könnte jemand ein Beispiel oder einen Link dazu geben, wie er verwendet werden kann, um beispielsweise ein einfaches Win32 HANDLE zu umbrechen?

Danke!

    
Mehrdad 08.01.2011, 04:35
quelle

1 Antwort

9

Haftungsausschluss: Ich habe meine Behauptungen nicht getestet, lesen Sie einfach die Dokumentation .

Payload bezieht sich auf das, was gespeichert wird. In Ihrem Fall ist die Nutzlast der Win32 HANDLE. Da HANDLE nur eine ganze Zahl ist, möchten Sie nicht tun:

%Vor%

Weil eine Windows-Funktion aufgerufen werden muss, wenn das Handle den Gültigkeitsbereich verlässt.

In std.containers.Array haben Sie eine Struktur namens Payload gesehen, die ein Feld namens _payload enthielt. Die Struktur wird die Speicherung der Daten sein, auf die über _payload zugegriffen wird. Dies bietet eine Indirektionsstufe, die später genutzt werden kann.

Sie werden feststellen, dass RefCounted eigentlich in der Array-Struktur . Dies bedeutet, dass der Destruktor für diese Struktur nur aufgerufen wird, wenn der Referenzzähler 0 ist. Also ist das ~ this () innerhalb von Payload, wo Sie Ihren HANDLE aufräumen möchten.

Was passiert: Da struct ein Werttyp ist, wird der Destruktor jedes Mal aufgerufen, wenn die Struktur den Gültigkeitsbereich verlässt, es gibt keinen für Array, aber Payload wird in RefCounted verpackt, der Destruktor für RefCounted! Payload ist auch genannt. Und nur wenn der Referenzzähler Null erreicht, wird der Destruktor für Payload selbst aufgerufen.

Nun hat RefCounted selbst Referenssemantik, das bedeutet, dass Sie ein Array a haben, das Sie dann automatisch b = a zuweisen können; und alles wird kopiert, aber RefCount hat eine postblits definiert Das bedeutet, dass die Daten nicht kopiert werden, aber der Referenzzähler wird sein inkrementiert.

Ich werde jetzt versuchen, Ihnen einen Wrapper-Umriss für das zu liefern, was Sie wollen. Es wird Ihnen wahrscheinlich helfen, die obigen Informationen zu visualisieren, aber es ist möglicherweise nicht ganz korrekt. Lass mich wissen, wenn etwas repariert werden muss.

%Vor%

Da es für eine Struktur keinen Standardkonstruktor gibt, möchten Sie wahrscheinlich eine freie Funktion bereitstellen, die diese Struktur zurückgibt.

    
he_the_great 08.01.2011, 17:11
quelle