2016-05-27 20 views
1

Ich lese diesen interessanten Artikel. http://www.codeproject.com/Articles/746630/O-Object-Pool-in-CplusplusZeiger verstehen

kann ich diese Zeile nicht verstehen _firstDeleted = *((T **)_firstDeleted);

_firstDeleted hat bereits T* geben. Kann jemand den Zweck dieser Aussage erklären?

+1

Wtf? Aufrufen von UB über striktes Aliasing ist das, was dies tut. (Glaube ich.) –

+0

@BaummitAugen, schwer zu sagen, ohne den vollen Code zu sehen, aber sehr wahrscheinlich in der Tat. – SergeyA

+1

Es ist eine Implementierung einer einfach verknüpften Liste. Der Code speichert einen Zeiger auf das nächste Element am Anfang des Speichers, auf den "_firstDeleted" verweist. – doug65536

Antwort

4

Wenn ein Objekt zerstört wird, werden seine ersten sizeof(T*) Bytes mit der Adresse des nächsten freien Objekts überschrieben.
(Das heißt, *T eigentlich nicht mehr ist ein T aber ein T* speichern, wenn Sie sehen, was ich meine. Die Besetzung dieser Neuinterpretation führt. Es ist formal eher nicht definiert.)

Dadurch wird die Wirkung der gelöschten Objekte hat Bilden einer verknüpften Liste von verfügbaren Speicherblöcken.

Wenn Sie den Objektspeicher für diese Liste wiederverwenden, benötigen Sie keine separate Liste freier Blöcke.

2

Code wie *((T **)content) = _firstDeleted; ist bekannt als "einen type-punted Zeiger", aka brechen die strengen Alias-Regeln, alias undefined Verhalten. Was der Autor versucht, ist _firstDeleted Punkt auf das erste "freie" Objekt in der Karte der nicht initialisierten Speicher, mit all den undefinierten Verhalten Güte, die damit einhergeht.

Modernes C++ (obwohl der Artikel 2014 veröffentlicht wurde) würde wahrscheinlich sicherere Einrichtungen für nicht initialisierten Speicher wie the C++ standard library verwenden.