2013-03-13 10 views
8

Czytałem Why is there no reallocation functionality in C++ allocators? i Is it possible to create an array on the heap at run-time, and then allocate more space whenever needed?, które jasno wskazują, że realokacja dynamicznej tablicy obiektów jest niemożliwa.Czy używana jest podpowiedź dotycząca alokacji?

Jednak w C++ Standardowa biblioteka przez Josuttis, stwierdza się podzielnik, allocator, posiada funkcję allocate z następującą składnią

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0) 

gdzie hint ma implementację określone znaczenie, które mogą być używane w celu poprawy wydajności.

Czy są jakieś implementacje, które wykorzystują to?

Odpowiedz

1

C++ 11 określa, w 20.6.9.1 członków podzielnika:

4 - [uwaga: w funkcji użytkownik pojemnika, adres sąsiedniego elementu jest często dobrym wyborem przekazać argument o wartości hint. - koniec uwaga]
[...]
6 - [...] Zastosowanie hint jest nieokreślona, ​​ale służyć jako pomoc do miejscowości jeżeli realizacji tego pragnie.

Przydzielanie nowych elementów w sąsiedztwie lub w pobliżu istniejących elementów w pamięci może wspomóc wydajność, poprawiając lokalizację; ponieważ zwykle są one zbuforowane razem, pobliskie elementy będą zmierzać razem w górę hierarchii pamięci i nie będą się wzajemnie eksmitować.

+0

Ah, więc jest to przydzielanie obiektów obok siebie zamiast ponownego przydzielania istniejącego obiektu? –

+0

Nie można po prostu przekazać następnego dostępnego adresu. Wskazówka musiała zostać uzyskana z poprzedniego wywołania do 'allocate'. – Potatoswatter

1

Nie mam pewności co do konkretnych implementacji, ale należy zauważyć, że przydzielający nie może zwrócić wartości wskaźnika podpowiedzi, zanim zostanie przekazana do deallocate. Tak więc nie może być używana jako prymitywna operacja do utworzenia reallocate.

Standard mówi, że wskazówka musiała zostać zwrócona przez poprzednie połączenie z numerem allocate. Mówi "Używanie [podpowiedzi] jest nieokreślone, ale jest to przeznaczone jako pomoc dla miejscowości." Jeśli więc alokujesz i zwalniasz sekwencję bloków o podobnej wielkości w jednym wątku, możesz przekazać wcześniej uwolnioną wartość, aby uniknąć rywalizacji o pamięć podręczną między pamięciami podręcznymi mikroprocesora.

W przeciwnym razie, gdy procesor B zobaczy, że adresy pamięci są nadal używane w pamięci podręcznej procesora A (nawet jeśli w pamięci znajdują się obiekty, które zostały zniszczone zgodnie z C++), musi przesyłać niepotrzebne dane przez magistralę. Lepiej pozwolić procesorom A i B na ponowne wykorzystanie własnych adresów w pamięci podręcznej.

2

Zyskałem znaczące zalety wydajnościowe dla czasów iteracji na małych typach skalarnych w moim plf::colony kontenerze C++ za pomocą podpowiedzi ze std :: allocator w Visual Studio 2010-2013 (szybkość iteracji zwiększyła się o ~ 21%) i znacznie mniejszych przyspieszeń pod GCC 5.1. Można więc bezpiecznie powiedzieć, że przy tych kompilatorach i std :: allocator ma to znaczenie. Ale różnica będzie zależna od kompilatora. Nie jestem świadomy stosunku ignorowania aluzji do alokatorów obserwujących podpowiedź.

Powiązane problemy