C ++ 14 przedstawia std::dynarray
:
std :: dynarray to kontener sekwencji, który hermetyzuje tablice o rozmiarze, który jest ustalony w konstrukcji i nie zmienia się przez cały okres istnienia obiektu.
std::dynarray
muszą być przydzielane w czasie wykonywania tak samo jak std::vector
.
Więc jakie są korzyści i wykorzystanie, std::dynarray
podczas gdy możemy używać tego, std::vector
który jest bardziej dynamiczny (a także skalowalny)?
std::valarray
zmieniono nazwę nastd::dynarray
? Jaka jest dynamika,std::dynarray
kiedy nie można zmienić jej rozmiaru?valarray
. Jest dynamiczna, ponieważ długość tablicy jest wartością w czasie wykonywania, nie musi być znana w czasie kompilacji, w przeciwieństwie dostd::array
dynarray
został usunięty z C ++ 14 i umieszczony w przyszłej Specyfikacji Technicznej (pomyśl o tym jako o nowej wersji TR1), ponieważ ma poważne problemy techniczne.Odpowiedzi:
dynarray
jest mniejszy i prostszy niżvector
, ponieważ nie musi zarządzać osobnymi wartościami rozmiaru i pojemności oraz nie musi przechowywać alokatora.Jednak główna korzyść związana z wydajnością ma pochodzić z faktu, że implementacje są zachęcane do alokacji
dynarray
na stosie, jeśli to możliwe, unikając alokacji sterty. na przykładstd::dynarray<int> d(5); // can use stack memory for elements auto p = new std::dynarray<int>(6); // must use heap memory for elements
Ta optymalizacja wymaga współpracy kompilatora, nie można jej zaimplementować jako czystego typu bibliotecznego, a niezbędna magia kompilatora nie została zaimplementowana i nikt nie jest pewien, jak łatwo to zrobić. Ze względu na brak doświadczenia we wdrożeniach, na posiedzeniu komitetu C ++ w Chicago w zeszłym tygodniu zdecydowano się wyciągnąć
std::dynarray
z C ++ 14 i wydać oddzielny dokument definiujący rozszerzenia tablic TS (specyfikacja techniczna)std::experimental::dynarray
i tablice związane ze środowiskiem uruchomieniowym (ARB, podobne do C99 VLA). Oznacza to,std::dynarray
że prawie na pewno nie będzie w C ++ 14.źródło
dynarray
. Zawsze uważałem, że potrzebujesz dwóch niezależnych wdrożeń istniejącej praktyki, zanim coś zostanie zakwalifikowane do normalizacji.dynarray
. Chociaż doświadczenie w implementacji jest bardzo przydatne, nie ma ustalonej reguły, która tego wymaga (ale niektórzy twierdzą, że powinno być!)Jak sam powiedziałeś,
std::dynarray
dotyczy tablicy dynamicznej o stałym rozmiarze . Nie można zmieniać rozmiaru. To z grubsza rzecz biorąc poprawę w ciągunew T[N]
i nadstd::unique_ptr<T[]>(new T[N])
.Brak konieczności zmiany rozmiaru lub zarządzania pojemnością oznacza, że możesz wdrożyć strukturę danych z mniejszą złożonością i mniejszą przestrzenią.
Co więcej,
std::dynarray
jest dziwnym zwierzęciem, które pozwala implementacji zaimplementować go na różne, niespecyficzne sposoby, np. Można umieścić tablicę na stosie. Wywołanie funkcji alokacji jest „opcjonalne”. Możesz określić alokator do konstruowania elementów tablicy, ale nie jest to część typu.Można również zastanawiać się, dlaczego musimy
std::dynarray
i tablice o zmiennej długości. Umowy VLA w C ++ 14 są znacznie bardziej restrykcyjne; mogą być tylko lokalnymi, automatycznymi zmiennymi i nie oferują możliwości określenia zasad alokacji i oczywiście nie mają standardowego interfejsu kontenera.Kilka przykładów z 23.3.4.2 „bieżącej wersji roboczej” (weź to, pamięć podręczna Google):
To, czy możesz użyć danego alokatora do skonstruowania elementów tablicy, jest cechą globalną:
Edycja: odpowiedź Jonathana Wakely'ego z pewnością będzie znacznie bardziej autorytatywna i wnikliwa.
źródło
dynarray
konstruktora nigdy nie jest używane do alokacji, jest używane tylko jako argument do konstruktorów elementów (przy użyciu „konstrukcji używa alokatora”). Dlatego nie możesz zapytać, czy alokator został użyty: ponieważ nigdy nie jest.