std::dynarray vs std::vector

C++14 présente std::dynarray:

Std:: dynarray est un conteneur de séquence qui encapsule des tableaux avec un taille qui est fixée à la construction et ne change pas tout au long de la la durée de vie de l'objet.

std::dynarray doit être alloué au moment de l'exécution comme std::vector.

Quels sont Donc les avantages et l'utilisation de std::dynarray, alors que nous pouvons utiliser std::vector, qui est plus dynamique (et aussi re-dimensionnées)?

78
demandé sur Nicol Bolas 2013-10-01 12:05:37

2 réponses

Alors, quels sont les avantages et l'utilisation de std::dynarray, Quand on peut utiliser std::vector qui est plus dynamique (redimensionnable)?

dynarray est plus petit et plus simple que vector, car il n'a pas besoin de gérer des valeurs de taille et de capacité séparées, et il n'a pas besoin de stocker un allocateur.

Cependant, le principal avantage de performance est destiné à provenir du fait que les implémentations sont encouragées à allouer dynarray sur la pile lorsque cela est possible, en évitant toute allocation de tas. par exemple

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

Cette optimisation nécessite la coopération du compilateur, elle ne peut pas être implémentée en tant que type de bibliothèque pure, et la magie du compilateur nécessaire n'a pas été implémentée et personne n'est sûr de la facilité à faire. En raison du manque d'expérience dans la mise en œuvre, lors de la réunion du Comité C++ à Chicago la semaine dernière, il a été décidé de tirer std::dynarray de C++14 et de publier un document distinct array extensions TS (technical specification) définissant std::experimental::dynarray et arrays of runtime bound (ARBs, similaire à C99 VLAs.) Cela signifie que std::dynarray ne sera presque certainement pas en C++14.

78
répondu Jonathan Wakely 2013-10-01 08:45:17

Comme vous l'avez dit vous-même, std::dynarray est un de taille fixe tableau dynamique. Il n'est pas redimensionnable. C'est grosso modo une amélioration par rapport à new T[N] et sur std::unique_ptr<T[]>(new T[N]).

Ne pas avoir besoin de redimensionner ou de gérer la capacité signifie que vous pouvez implémenter la structure de données avec moins de complexité et moins d'espace.

De plus, std::dynarray est un animal étrange qui permet à l'implémentation de l'implémenter de différentes manières non spécifiques, par exemple il est possible de mettre le tableau sur la pile. L'appel d'un affectation de la fonction est "facultatif". Vous pouvez spécifier un allocateur pour construire les éléments du tableau, mais cela ne fait pas partie du type.

Vous pourriez aussi vous demander pourquoi nous avons besoin std::dynarray et tableaux de longueur variable. Les VLAs en C++14 sont beaucoup plus restrictifs; ils ne peuvent être que des variables locales et automatiques et n'offrent aucun moyen de spécifier une politique d'allocation, et bien sûr ils n'ont pas d'interface de conteneur standard.


Quelques exemples de 23.3.4.2 d'un " projet actuel" (prenez cela, Google cache):

explicit dynarray(size_type c);

effets: alloue le stockage pour les éléments c. peut ou non invoquer le global operator new.

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

effets: équivalent aux constructeurs précédents sauf que chaque élément est construit avec uses - allocator construction .

Si vous pouvez utiliser un allocateur donné pour construire les éléments du tableau est un global trait de caractère:

Modèle struct uses_allocator, Alloc> : true_type { };

nécessite: Alloc doit être un allocateur (17.6.3.5). [ Note: La spécialisation de ce trait informe les autres composants de la bibliothèque que dynarray peut être construit avec un allocator, même s'il n'a pas de allocator_type imbriqué.]

Edit: la réponse de Jonathan Wakely devrait être beaucoup plus autoritaire et perspicace.

31
répondu Kerrek SB 2013-10-01 09:06:27