2017-10-20 4 views
0

Ich habe einen Pool-Allokator, den ich als Übung geschrieben habe, der die C++ 11 std :: allocator-Anforderungen erfüllt und funktioniert, die funktioniert, aber die von mir verwendete Richtlinie als Referenz (am folgenden Papierträger):Anpassung eines Chunk-Pool-Allokators fester Größe an bestimmte STL-Container

https://pdfs.semanticscholar.org/4321/a91d635d023ab25a743c698be219edcdb1a3.pdf

ist nur dann wirklich gut, ein einzelnes Objekt in einen Speicherblock mit einem ausreichenden Größe für sie zu einem Zeitpunkt für die Zuteilung.

Ich stelle fest, dass die std :: allocator Template-Methode "allocate" einen Parameter hat, wo STL-Container eine Anzahl von Blöcken anfordern können, die gleichzeitig zugeordnet werden. Zum Beispiel sieht es wie std :: basic_string aus, sobald es eine bestimmte Stringgröße überschreitet, die es auf dem Stack behält, verschiebt es das Ganze sofort auf den Heap, indem es einen zusammenhängenden Speicherblock von dem Allokator anfordert, der groß genug ist, um ein char-Array zu speichern Halten Sie die gesamte Zeichenfolge. Die dynamische Expansion von std :: vector scheint ähnlich zu funktionieren.

Gibt es eine Möglichkeit, einen Zuordner anzupassen, der für die Rückgabe von Stücken mit fester Größe die Größe des Typs, für den er auf diesem STL-Containertyp erstellt wurde, verwendet?

+2

Ein Standardzuordner muss in der Lage sein, zusammenhängenden Speicher für eine bestimmte Anzahl von Elementen des Typs zuzuordnen, auf dem er basiert. –

+1

Sie können das (optionale) Member 'size_type max_size()' angeben und bei Verletzung werfen – Caleth

Antwort

1

Sie könnten diesen Weg gehen:

On the other hand, multiple instances of numerous fixed-sized 
pools can be used to produce a general overall flexible 
general solution to work in place of the current system 
memory manager. 

und behandeln jeden unterschiedlich großen Antrag als Antrag für einen neuen Pool, das heißt Ihre „Objektgröße“ ist das Objekt tatsächlich * zählen. Sie werden viel RAM brennen. Sie könnten eine Obergrenze für die Array-Größe festlegen und auf die generische Standardzuordnung oberhalb dieses Bereichs zurückgreifen.

+0

Ich habe festgestellt, dass meine Implementierung generisch genug ist, dass ich Allokatoren innerhalb von Allokatoren platzieren kann, dh einen Speicherpool von N Speicherpools erstellen die selbst zusammenhängende Speicherblöcke zuweisen, die groß genug sind, um ein Array von Zeichen für beispielsweise std :: basic_string aufzunehmen. Unglücklicherweise erwartet std :: basic_string, dass sein Zuweiser an einen Zeichentyp angebunden ist, nicht einen Zeiger auf ein Array von Zeichen, also müsste ich eine Möglichkeit finden, die Implementierung so zu ändern, dass ihre Blockgröße groß genug ist, um zusammenhängenden Speicher zurückzugeben wenn auf einem Basistyp getemplated – Bitrex

+1

Fügen Sie der allocate-Funktion einen zweiten Parameter hinzu, der die Anzahl der Einheiten darstellt. –

Verwandte Themen