MemoryPool mit Objekten unterschiedlicher Größe
Verfasst: Do Sep 17, 2015 4:02 pm
Hi, ich habe mal wieder eins meiner merkwürdigen Sonderfall-Probleme. Ich suche einen Container, den ich ähnlich handhaben kann wie einen Vector. Nur kommen dort allerdings keine gleich großen Objekte rein.
Annahme:
Was ich nun brauche ist quasi ein std::vector< GeoObjekt > in dem Linien und Segmente konstruiert werden können. Das Problem ist nun, dass ein Punkt 24 Byte groß ist und ein Segment 64 Bytes groß ist.
Der "Vektor" darf nicht realloziert werden. Ich muss also beliebig viele beliebig große Elemente reinwerfen dürfen, ohne dass der Speicher ausgeht. Und mit reinwerfen meine ich, dass die Elemente direkt im Vector erzeugt werden und nicht dort hinverschoben werden können. Dafür wäre vermutlich Placement-New erforderlich - ich würde mich allerdings über Alternativen freuen.
Das Problem: Ich habe sehr, sehr viele kleine Objekte die einzeln im Speicher angelegt werden. Das kostet zum einen viel Zeit, zum anderen viel Speicher. Ich möchte also gerne Memory-Pools verwenden. Die Objekte sind natürlich alle unterschiedlich groß und dürfen - nachdem sie einmal erzeugt wurden - nicht mehr verschoben werden, weil Zeiger auf sie herumgereicht werden. Der Container muss sich also was anderes einfallen lassen, um zu wachsen.
Nun noch das Highlight: Der Container muss auf zwei verschiedene Weisen ansprechbar sein: Zum einen per Index (1, 2, 3, ...) und zum anderen haben manche Objekte Namen. Nicht alle. Aber manche. Und die muss ich wiederfinden, falls ich die Adresse nicht zur Hand habe.
Hat jemand eine Idee, ob das Problem irgendwo jemand schonmal als Container bereitgestellt hat? ^^
Annahme:
Code: Alles auswählen
struct GeoObjekt {
std::string getName() const;
};
struct Point : public GeoObject
{
double x, y, z;
};
struct Segment : public Geo
{
Segment( std::string const n ) : name(n) {}
std::string name;
Point start, end;
};
Der "Vektor" darf nicht realloziert werden. Ich muss also beliebig viele beliebig große Elemente reinwerfen dürfen, ohne dass der Speicher ausgeht. Und mit reinwerfen meine ich, dass die Elemente direkt im Vector erzeugt werden und nicht dort hinverschoben werden können. Dafür wäre vermutlich Placement-New erforderlich - ich würde mich allerdings über Alternativen freuen.
Code: Alles auswählen
myContainer c;
new( c.alloc< Segment >() ) Segment( "Hugo" );
new( c.alloc< Point >() ) Point;
Nun noch das Highlight: Der Container muss auf zwei verschiedene Weisen ansprechbar sein: Zum einen per Index (1, 2, 3, ...) und zum anderen haben manche Objekte Namen. Nicht alle. Aber manche. Und die muss ich wiederfinden, falls ich die Adresse nicht zur Hand habe.
Code: Alles auswählen
Point * p = dynamic_cast< Point * >( c[1] );
Segment * s = dynamic_cast< Segment * >( c["Hugo"] );