2011-07-28 7 views

Odpowiedz

14

wygląda cechą stanowych podzielników w pojemnikach STL już jest szeroko wspierany. W większości przypadków stanowość alokatora nie powoduje problemów. To, co nie jest jeszcze szeroko wspierane, to nowy sposób radzenia sobie z problematycznymi sytuacjami (zamiana kontenera (czy zamieniać również alokatorem), splice list).

This thread mówi:

w kodzie dla większości bibliotek standardowych bieżących (w tym Dinkumware na stosowany przez MS), stanowe podzielniki są obsługiwane

This tread (libstdC++, 2004) mówi (o ile zrozumiałem poprawnie):

Wspieramy już alokatory, gdzie l1.get_allocator() != l2.get_allocator(). Nie robimy żadnych specjalnych postanowień, aby wykryć te alokatory w splice() i swap().

This blog entry (libstdC++, 2009) mówi:

istniejących kontenerów w trybie C++ 0x są teraz bardziej efektywne wraz z stanowych podzielników (czyli nie ma podzielniki są tworzone w locie na elemencie czasu budowy).

This document mówi o nowym libc++ library:

Wszystkie pojemniki spełniają wszystkie najnowsze wymagania podzielnik które w pełni obsługują stanowe podzielników. - Przestrzeń dla podzielników bezstanowych zoptymalizowanych.

EASTL obsługuje państwowe podzielniki.

This thread zawiera interesujący spór dotyczący przenośności tej funkcji.

Tak więc większość implementacji STL obsługuje podzielniki stanów, co oznacza, że ​​nie tworzą one dodatkowych instancji typu alokatora pod maską, ale przechowują instancję alokatora dostarczoną przez klienta, a wszystkie alokacje/deallokacje są wykonywane przez to. Jednak sposób, w jaki obsługują one pingowanie swap i list::splice jest nieudokumentowanym, nieprzenośnym.

AKTUALIZACJA: STL VS2008 wymaga, aby alokatory miały konstruktora kopiującego z szablonami, co uniemożliwia IMO najważniejsze użycie niestandardowych alokatorów: proste, posegregowane przechowywanie.

Dla każdego, kto nie jest zadowolony z obecnego stanu stateful podzielników w STL, polecam rozważyć Boost.Intrusive i Boost.Container.

+0

Właściwie _wszystkie biblioteki standardowe wymagają, aby alokatory miały szablonowy konstruktor kopiowania i szablon 'rebind' i używają ich. Dzieje się tak, ponieważ wszystkie pojemniki z wyjątkiem 'wektora' i' deque' przydzielają elementy jako część struktury definiowanej przez implementację, więc muszą utworzyć alokację dla tej struktury z udostępnionego przydziału. Jest to rzecz, o której autor przydziału musi po prostu wziąć pod uwagę. –