Benutzerdefinierte STL-Zuordner zum Verwalten verschiedener Speicherbereiche

8

Ich möchte verschiedene Instanzen einer benutzerdefinierten STL-Zuordnungsklasse verwenden, um verschiedene Speicherbereiche zu verwalten, und dann eine Zuweisungsinstanz für einen STL-Container angeben können, so dass jeder Container nur aus seinem zugewiesenen Speicherplatz bezieht. Aber ich sehe nicht, wie ich das machen kann. Ich sehe, wie ich einen Zuordnertyp in die Template-Parameter eines STL-Containers übergeben kann, aber ich möchte etwas wie die Übergabe einer Zuweisungsinstanz in den Konstruktor eines STL-Containers. Gibt es eine Möglichkeit, dies in STL zu tun?

    
boiler96 21.10.2009, 23:21
quelle

3 Antworten

17

Leider können STL-Zuordner keinen Status haben (oder müssen zumindest sehr vorsichtig sein, wie dieser Zustand verwendet wird) - jede Instanz eines bestimmten Zuordnungstyps muss äquivalent sein, damit STL-Container effektiv mit ihnen arbeiten können. Ich kann mich im Moment nicht an die Details erinnern, aber ich weiß, dass Scott Meyers dieses Problem ausführlich in "Effective STL" diskutiert , Punkt 10: Beachten Sie die Zuweisungskonventionen und Einschränkungen.

Sie können jedoch Template-Zuweiser haben, die den Unterschieden zwischen den Allokatoren, die im Zuweisungs-Typ gekapselt sind, sehr ähnlich sind und verschiedene "Instanziierungen" der Zuweisungs-Vorlage verwenden (jede "Instanziierung" der Vorlage) ein anderer Typ). Auch hier ist meine Erinnerung, dass Meyers das ziemlich deutlich diskutiert.

Siehe beispielsweise diesen Absatz in einem Artikel von Anthony Aue, "Verbessern der Leistung mit benutzerdefinierten Poolzuweisungen für STL" :

  

Eine potentiell ernsthaftere Einschränkung besteht darin, dass der Zuweiser nichtstatische Daten verwendet, da er technisch nicht standardkonform ist, da der Standard erfordert, dass Zuweiser des gleichen Typs äquivalent sind. Eine ausführliche Erläuterung des Problems finden Sie unter Effektive STL (Punkt 10). Dies erfordert, dass ein Zuordner für einen gegebenen Typ in der Lage ist, Speicher freizugeben, der von irgendeiner anderen Instanz eines Zuweisers für diesen Typ zugeteilt wurde. Für viele Verwendungen von Standardcontainern ist diese Anforderung nicht notwendig (manche sagen drakonisch). Es gibt jedoch zwei Fälle, in denen diese Anforderung unbedingt erforderlich ist: list :: splice und swap (). Der Fall von swap () ist besonders gravierend, weil er benötigt wird, um bestimmte Operationen an Containern in einer ausnahmesicheren Weise zu implementieren (siehe Ausnahme C ++, Punkt 12). Technisch könnte Swap (angesichts von Allokatoren, die nicht gleichwertige Elemente vergleichen können) implementiert werden (und in einigen Fällen auch umgesetzt werden), oder die Allokatoren könnten zusammen mit den Daten ausgetauscht werden - dies ist jedoch nicht immer der Fall. Wenn Sie also swap () oder list :: splice verwenden, sollten Sie sicherstellen, HoldingPolicySingleton zu verwenden; Andernfalls werden Sie in ein ziemlich unangenehmes Verhalten geraten.

Siehe auch die Diskussion von Stephan T. Lavavej in Newsgroup-Thread .

Ich werde später Abend aktualisieren, wenn jemand anderes die Details in der Zwischenzeit nicht gibt.

    
Michael Burr 21.10.2009, 23:56
quelle
6

Mit den STL-Containern können Sie den Zuordner als Argument für den Konstruktor übergeben.

Hier sind zum Beispiel die passenden Konstruktoren für vector:

%Vor%

Standardmäßig verwenden sie nur einen standardmäßig konstruierten Zuordner.

    
Richard Corden 21.10.2009 23:50
quelle
0

Vielleicht könnten Sie eine Menge von Zuordnungstypen codieren, die ein statisches Zeigen auf separate Speicherbereiche enthält.

Wenn der STL-Container dann seinen Zuordner erstellt, verwendet der Zuordner den Speicherplatz, der diesem Zuordner zugewiesen ist.

Nehmen Sie zur Vereinfachung an, Sie möchten zwei Speicherbereiche verwenden. Erstellen Sie zwei Zuordnungstypen, einen für jeden Speicherplatz. Übergeben Sie den Zuordnungstyp nach Bedarf an die STL-Containerkonstruktoren.

    
ravenspoint 21.10.2009 23:43
quelle

Tags und Links