C ++ 14 präsentiert std::dynarray
:
std :: dynarray ist ein Sequenzcontainer, der Arrays mit einer Größe kapselt, die bei der Erstellung festgelegt ist und sich während der Lebensdauer des Objekts nicht ändert.
std::dynarray
muss zur Laufzeit genauso zugeordnet werden wie std::vector
.
Was sind also die Vorteile und die Nutzung von, std::dynarray
während wir nutzen können, std::vector
die dynamischer (und auch anpassbarer) sind?
std::valarray
umbenannt instd::dynarray
? Was ist dynamisch,std::dynarray
wenn die Größe nicht geändert werden kann?valarray
. Es ist dynamisch , weil die Länge des Arrays ein Laufzeitwert ist, braucht es nicht zum Zeitpunkt der Kompilierung bekannt sein, im Gegensatzstd::array
dynarray
C ++ 14 entfernt und in eine zukünftige technische Spezifikation aufgenommen wurde (stellen Sie sich das als neue Version von TR1 vor), da es einige schwerwiegende technische Probleme gibt.Antworten:
dynarray
ist kleiner und einfacher alsvector
, da keine separaten Größen- und Kapazitätswerte verwaltet werden müssen und kein Allokator gespeichert werden muss.Der Hauptvorteil der Leistung soll jedoch in der Tatsache liegen, dass Implementierungen dazu ermutigt werden,
dynarray
wenn möglich auf dem Stapel zuzuweisen , um jegliche Heap-Zuweisung zu vermeiden. z.BDiese Optimierung erfordert die Zusammenarbeit des Compilers, kann nicht als reiner Bibliothekstyp implementiert werden, und die erforderliche Compilermagie wurde nicht implementiert, und niemand ist sich sicher, wie einfach dies zu tun ist. Aufgrund der mangelnden Implementierungserfahrung wurde auf der Sitzung des C ++ - Komitees in Chicago letzte Woche beschlossen,
std::dynarray
aus C ++ 14 auszusteigen und ein separates Dokument zur Definitionstd::experimental::dynarray
von Array-Erweiterungen TS (Technical Specification) und Arrays von Runtime Bound (ARBs, ähnlich) herauszugeben zu C99-VLAs.) Dies bedeutet, dassstd::dynarray
es mit ziemlicher Sicherheit nicht in C ++ 14 sein wird.quelle
dynarray
in der Wildnis. Ich habe immer gedacht, dass Sie zwei unabhängige Implementierungen der bestehenden Praxis benötigen, bevor etwas für die Standardisierung in Frage kommt.dynarray
. Obwohl Implementierungserfahrung sehr nützlich ist, gibt es keine festgelegte Regel, die dies erfordert (aber einige würden sagen, dass es eine geben sollte!)Wie Sie selbst sagten,
std::dynarray
handelt es sich um ein dynamisches Array mit fester Größe . Die Größe kann nicht geändert werden. Es ist etwa eine Verbesserung gegenüber zu sprechennew T[N]
und überstd::unique_ptr<T[]>(new T[N])
.Wenn Sie die Größe nicht ändern oder die Kapazität nicht verwalten müssen, können Sie die Datenstruktur mit weniger Komplexität und weniger Platz implementieren.
Darüber hinaus
std::dynarray
ist es ein seltsames Tier, das es der Implementierung ermöglicht, es auf verschiedene, unspezifische Arten zu implementieren, z. B. ist es möglich, das Array auf den Stapel zu legen. Das Aufrufen einer Zuordnungsfunktion ist "optional". Sie können einen Allokator angeben, um die Elemente des Arrays zu erstellen, dies ist jedoch nicht Teil des Typs.Sie fragen sich vielleicht auch , warum wir brauchen
std::dynarray
und Arrays variabler Länge. VLAs in C ++ 14 sind viel restriktiver. Sie können nur lokale, automatische Variablen sein und bieten keine Möglichkeit, eine Zuordnungsrichtlinie anzugeben, und natürlich haben sie keine Standard-Containerschnittstelle.Einige Beispiele aus 23.3.4.2 eines "aktuellen Entwurfs" (nehmen Sie das, Google Cache):
Ob Sie einen bestimmten Allokator zum Erstellen der Array-Elemente verwenden können oder nicht, ist ein globales Merkmal:
Bearbeiten: Jonathan Wakelys Antwort wird sicherlich viel maßgeblicher und aufschlussreicher sein.
quelle
dynarray
den Konstruktor wird niemals für die Zuordnung verwendet, sondern nur als Argument für die Konstruktoren der Elemente (unter Verwendung der "Verwendungszuweisungskonstruktion"). Aus diesem Grund können Sie nicht abfragen, ob der Allokator verwendet wurde: weil dies niemals der Fall ist.