Zusammenhängende Speicherzuweisung für mehrere kleine std :: Vektoren?

8

Ich würde gerne einen Weg finden, mehrere std::vectors , jede von einer anderen, aber bekannten und einigermaßen kleinen Größe, im zusammenhängenden Speicher zu speichern. Ich weiß, dass ich meine eigene Klasse schreiben könnte, mit einem sehr großen Array und mit Zeigern am Anfang jedes Unterabschnitts des Arrays innerhalb des größeren Arrays, die wie eine separate Entity behandelt werden, aber es scheint, als sollte es einen klügeren Weg dafür geben .

Gibt es eine Möglichkeit, allocators zum Beispiel zu verwenden, um zusammenhängendes std::vectors zu erstellen? Ich möchte das Rad nicht einfach neu erfinden, nur weil ich diese Speicherstelle von sonst normal std::vectors

möchte

Ich weiß nicht, wie ich überhaupt anfangen soll zu programmieren. Ich muss einen Zuordner erstellen, der einen Zeiger auf Speicher verwendet, einen Vektor dort zuweist und dann irgendwie die Adresse des Endes dieses Vektors zurückgibt, so dass der nächste std::vector Zuordner das holen könnte und es wieder tun würde. Wie kann ein allocator einen Wert zurückgeben?

    
sunny 30.07.2015, 15:21
quelle

2 Antworten

1

Die Lösung ist @ HowardHinnants short_alloc . Ich möchte auf dem Heap reservieren, also muss new , *** verwendet werden, aber ansonsten tut Howards Code genau das, was ich möchte.

%Vor%

Das fehlende Stück aus meiner Sicht, als ich die Frage stellte, war, dass allocators constructors haben kann, die Argumente nehmen:

%Vor%

Ich habe die Code-Referenz in einem anderen SO-Post gefunden: Fragen zu Hinnants Stack-Allokator auf das in dem CodeReview-Post verwiesen wurde, den Chris Drew in seinem Kommentar oben vorgeschlagen hat. Danke euch allen.

*** Der Code verwendet new in der Methode allocate , so dass ich nicht sicher bin, ob dies auf dem Stack (wie es aus der Deklaration von buf_ * hervorgeht) oder auf dem Heap (Verwendung von%) co_de%) ...

    
sunny 31.07.2015, 14:19
quelle
0

Für Ihre Anforderung würde ich einen benutzerdefinierten Zuordner implementieren, der std :: allocator erweitert und die Methode "allocate, deallocate", die Stücke aus einem Speicherpool abruft, überschreibt. Wenn Sie die erforderliche maximale Größe bereits kennen, sollte die Auswahl der Speicherpoolgröße kein Problem sein.

    
kchoi 31.07.2015 14:52
quelle

Tags und Links