2010-03-31 13 views
6

Dlaczego boost :: fast_pool_allocator został zbudowany na szczycie pojedynczej puli, a nie osobna pula na instancję przydziału? Lub mówiąc inaczej, dlaczego tylko to zapewnia, a nie opcja posiadania puli na jednego przydziału? Czy to byłby zły pomysł?boost pool_alloc

Mam klasę, która używa wewnętrznie około 10 różnych typów boost :: unordered_map. Gdybym użył std :: allocator, wtedy cała pamięć wróciłaby do systemu, gdy nazywa się delete, podczas gdy teraz muszę w pewnym momencie wywołać release_memory na wielu różnych typach alokatorów. Czy byłbym głupi, aby przetasować mój własny przydział, który używa puli zamiast singleton_pool?

dzięki

Odpowiedz

4

Trudno za podzielnik mieć stan, ponieważ wszystkie instancje w podzielniki musiał być „równoważne” do wykorzystania przez biblioteki standardowej (przynajmniej przenośnie).

Od 20.1.5/4 „Wymagania podzielnik”:

Wdrożenia pojemników opisanych w niniejszej normie międzynarodowej wolno zakładać, że ich parametr szablonu Allocator spełnia następujące dwa dodatkowe wymagania wykraczające poza te w tabeli 32.

  • Wszystkie wystąpienia danego rodzaju przydzielania muszą być stosowane zamiennie i zawsze porównać równa każdej innej

Następnie przechodzi się do powiedzenia:

Twórcy implementacji są zachęcani do dostarczania biblioteki, który może akceptować podzielników że hermetyzacji bardziej ogólnych modeli pamięci i że wsparcie nie równe instancji. W takich implementacjach, wszelkie wymagania nałożone na alokatory przez kontenery wykraczające poza te wymagania, które pojawiają się w Tabeli 32, oraz semantyka kontenerów i algorytmów, gdy instancje alokatorów porównują nierówności, są zdefiniowane przez implementację.

Można więc napisać implementację, która zezwala na nie równoważne instancje alokujące, ale wtedy alokator jest zależny od zachowania zdefiniowanego w implementacji.

Zobacz this other SO answer dla niektórych dodatkowych szczegółów (i wygląda na to, muszę tendencję do pewnego obiecanej aktualizacji tej odpowiedzi ...)

+0

Hmm, błędy kosza mój ostatni komentarz. Dziękuję za wyjaśnienie. Być może uda mi się uciec, jeśli będę trzymał się opcji unordered_map i unikam unordered_map :: operator = lub unordered_map :: swap –

+0

To zmieni się w C++ 0x. –