Ich versuche herauszufinden, wie ich einen Container (wie std :: vector) von Objekten durchlaufen kann, die eine gemeinsame Basis-Elternklasse zusammenhängend im Speicher haben.
Um das Problem zu demonstrieren, verwenden wir die folgenden Beispiele.
%Vor%Wenn wir nun std :: vector verwenden, um zu iterieren, würden die Objekte im zusammenhängenden Speicher bleiben, aber wir würden schneiden, da für die abgeleiteten Eigenschaften kein Platz ist.
Also müssen wir die polymorphe Technik benutzen, indem wir Zeiger wie diese verwenden
%Vor%Soweit ich weiß, sollte das gut funktionieren, da die Klassen implementiert sind.
Problem: Jetzt enthält der Vektor Zeiger im zusammenhängenden Speicher, aber das bedeutet nicht, dass die Adressen, auf die sie zeigen, sind.
Wenn ich also jederzeit Objekte in den Vektor löschen und einfügen kann, werden die Objekte überall im Speicher verteilt.
Frage: Es scheint, als ob jeder vorschlägt, es auf die Art std :: vector zu tun, aber warum wird es nicht als problematisch angesehen, dass es nicht zusammenhängend im Speicher iterierbar ist (vorausgesetzt, wir verwenden den Zeiger tatsächlich)?
Muss ich es auf Copy-Pasta-Art machen?
%Vor%Ich vermute, dass es keine wirkliche Lösung dafür geben kann, da Objekte unterschiedlicher Größe linear im Speicher zu halten, keinen Sinn ergibt, aber wenn mir jemand einen Rat geben kann, würde ich das schätzen.
std::vector<T>
iterators nehmen an, dass die Objekte im zusammenhängenden Speicher vom Typ T
sind, std::vector<T>::iterator::operator++
berücksichtigt sizeof T
als invariant - dh, es wird die spezifische Instanz für die Größe nicht konsultiert.
Im Prinzip können Sie sich vector
und vector::iterator
als dünne Fassade über einem T* m_data
Zeiger vorstellen, so dass iterator++
eigentlich nur eine einfache Zeigeroperation ist.
Sie müssen wahrscheinlich einen benutzerdefinierten Zuordner und direkt an Ort und Stelle new
verwenden, um Ihre Daten vorzubereiten, begleitet von Indizierung, Verlinkung usw. Betrachten Sie vielleicht etwas wie Ссылка
Siehe auch boost :: stable_vector
std::vector
weist die Objekte im fortlaufenden Speicher zu, aber die Objektzeiger, die Sie im Vektor speichern, nicht. So durchlaufen Sie vector
. Der folgende Code ist in C ++ 14 geschrieben. Das beschriebene Problem ist durch diese Lösung nicht lösbar, da die Objektzeiger im fortlaufenden Speicher, nicht aber den eigentlichen Objekten gespeichert sind.
Live-Demo hier .