std :: dynarray vs std :: vector

84

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::dynarraymuss zur Laufzeit genauso zugeordnet werden wie std::vector.

Was sind also die Vorteile und die Nutzung von, std::dynarraywährend wir nutzen können, std::vectordie dynamischer (und auch anpassbarer) sind?

masoud
quelle
1
Hey, seit wann ist "C ++ 14" ein Tag? Ich habe
neulich
1
Wird std::valarrayumbenannt in std::dynarray? Was ist dynamisch, std::dynarraywenn die Größe nicht geändert werden kann?
Yasouser
9
@yasouser, nein, es hat nichts damit zu tun 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
Jonathan Wakely
20
Beachten Sie, dass auf der Sitzung des C ++ - Normungsausschusses in der vergangenen Woche dynarrayC ++ 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.
Pete Becker
2
Dynarray ist nicht mehr Teil des Entwurfs C ++ 14
Cassinaj

Antworten:

89

Also, was sind die Vorteile und die Verwendung von std::dynarray, wenn wir verwenden können, std::vectordie dynamischer (veränderbar) ist?

dynarrayist kleiner und einfacher als vector, 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, dynarraywenn möglich auf dem Stapel zuzuweisen , um jegliche Heap-Zuweisung zu vermeiden. z.B

std::dynarray<int> d(5);   // can use stack memory for elements
auto p = new std::dynarray<int>(6);  // must use heap memory for elements

Diese 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::dynarrayaus C ++ 14 auszusteigen und ein separates Dokument zur Definition std::experimental::dynarrayvon Array-Erweiterungen TS (Technical Specification) und Arrays von Runtime Bound (ARBs, ähnlich) herauszugeben zu C99-VLAs.) Dies bedeutet, dass std::dynarrayes mit ziemlicher Sicherheit nicht in C ++ 14 sein wird.

Jonathan Wakely
quelle
1
Großartig, ich frage mich , ob es irgendwelche nicht-triviale Implementierungen dynarrayin 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.
Kerrek SB
Nein, es sind keine Implementierungen einer Stapelzuweisung bekannt 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!)
Jonathan Wakely
Nur Brainstorming hier, aber was ist mit dem Erstellen von 2 Funktionen: std :: dynarray make_dyn_autostorage (int) und std :: dynarray make_dyn_heap (int)?
Serve Laurijssen
2
@KerrekSB, ja, Library Motion 10 in Chicago lautete: "Verschieben Sie ein Arbeitspapier für eine geplante Array-Erweiterung TS, entfernen Sie die Änderungen, die von den beiden Papieren N3639 auf die C ++ 14-CD angewendet wurden." Arrays in Laufzeitgröße mit Automatik Speicherdauer (Revision 5) " N3662 ," C ++ Dynamic Arrays (Dynarray) "und weisen Sie den Projekteditor für Array Extensions TS an, diese Wörter als ursprünglichen Inhalt auf das Array Extensions Working Paper anzuwenden."
Jonathan Wakely
3
@ h9uest das hat nichts mit "den C ++ - Leuten" zu tun, das sind die offiziellen Namen für die Ergebnisse eines technischen ISO- Komitees, siehe iso.org/iso/home/standards_development/… und iso.org/iso/home/standards_development /…
Jonathan Wakely
31

Wie Sie selbst sagten, std::dynarrayhandelt 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 sprechen new T[N]und über std::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::dynarrayist 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):

explicit dynarray(size_type c);

Effekte: Ordnet Speicher für cElemente zu. Kann oder kann nicht das globale aufrufen operator new.

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

Effekte: Entspricht den vorhergehenden Konstruktoren, außer dass jedes Element mit einer Verwendungszuweisungskonstruktion erstellt wird .

Ob Sie einen bestimmten Allokator zum Erstellen der Array-Elemente verwenden können oder nicht, ist ein globales Merkmal:

Template-Struktur use_allocator, Alloc>: true_type {};

Benötigt: Alloc muss ein Allokator sein (17.6.3.5). [ Hinweis: Durch die Spezialisierung dieses Merkmals werden andere Bibliothekskomponenten informiert, dynarraydie mit einem Allokator erstellt werden können, obwohl dieser keinen verschachtelten Allokatortyp hat.]

Bearbeiten: Jonathan Wakelys Antwort wird sicherlich viel maßgeblicher und aufschlussreicher sein.

Kerrek SB
quelle
Die Übergabe eines Allokators an dynarrayden 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.
Jonathan Wakely
@ JonathanWakely: Ah, das habe ich falsch verstanden. Danke, behoben!
Kerrek SB