314 votes

Y a-t-il tout usage pour unique_ptr avec tableau ?

``a un support pour les tableaux, par exemple :

mais est-il nécessaire ? Il est probablement plus facile à utiliser ou .

Ne trouvez-vous pas toute utilisation pour cette construction ?

331voto

Nicol Bolas Points 133791

Certaines personnes n'ont pas le luxe de consommer std::vector, même avec des allocateurs. Certaines personnes ont besoin dynamiquement un tableau de taille, de sorte std::array . Et certaines personnes obtenir leurs tableaux à partir d'un autre code qui est connu pour retourner un tableau; et que le code ne va pas être réécrit pour retourner un vector ou quelque chose.

En autorisant unique_ptr<T[]>, vous ces besoins.

En bref, vous utilisez unique_ptr<T[]> lorsque vous avez besoin de. Lorsque les solutions de rechange ne sont tout simplement pas aller travailler pour vous. C'est un outil de dernier recours.

184voto

Pseudonym Points 676

Il y a des compromis, et vous choisissez la solution qui correspond à ce que vous voulez. Sur le dessus de ma tête:

Taille initiale

  • vector et unique_ptr<T[]> permettre à la taille pour être spécifiée au moment de l'exécution
  • array ne permet que la taille pour être spécifiée au moment de la compilation

Le redimensionnement

  • array et unique_ptr<T[]> ne permettent pas de redimensionnement
  • vector ne

De stockage

  • vector et unique_ptr<T[]> stocker les données en dehors de l'objet (généralement sur le tas)
  • array stocke les données directement dans l'objet

La copie

  • array et vector permettre la copie
  • unique_ptr<T[]> ne permet pas la copie

Swap/déplacer

  • vector et unique_ptr<T[]> ont O une fois(1) swap et les opérations de déplacement de
  • array a O(n) fois swap et les opérations de déplacement, où n est le nombre d'éléments dans le tableau

Pointeur/référence/itérateur invalidation

  • array assure pointeurs, références et itérateurs ne sera jamais invalidé si l'objet est en direct, même sur swap()
  • unique_ptr<T[]> n'a pas d'itérateurs; les pointeurs et les références ne sont invalidées par swap() tandis que l'objet est en direct. (Après la permutation, les pointeurs point dans le tableau que vous avez échangé avec, de sorte qu'ils sont encore "valide" dans ce sens.)
  • vector peut invalider les pointeurs, références et des itérateurs sur toute réaffectation (et fournit des garanties que réaffectation ne peut se faire que sur certaines opérations).

La compatibilité avec les concepts et les algorithmes

  • array et vector sont à la fois des Conteneurs
  • unique_ptr<T[]> n'est pas un Conteneur

Je dois admettre, il se présente comme une opportunité pour certains de refactoring avec la politique de base de la conception.

107voto

Charles Salvia Points 28661

L'une des raisons que vous pourriez utiliser un unique_ptr si vous ne voulez pas payer le coût d'exécution de la valeur de l'initialisation de la matrice.

std::vector<char> vec(1000000); // allocates AND value-initializes 1000000 chars

std::unique_ptr<char[]> p(new char[1000000]); // allocates storage for 1000000 chars

L' std::vector constructeur et std::vector::resize() la valeur d'initialisation- T - mais new ne sera pas le faire si T est une GOUSSE.

Voir la Valeur Initialisée Objets en C++11 et std::vector constructeur

Notez que vector::reserve n'est pas une alternative ici: pour accéder à l'pointeur brut après std::vector::la réserve de sécurité?

C'est la même raison un programmeur C peut choisir malloc sur calloc.

36voto

Andy Prowl Points 62121

Un peut être copié autour, tandis que permet d’exprimer la propriété unique du tableau. `` , exige en revanche, la taille à déterminer au moment de la compilation, qui peut être impossible dans certaines situations.

11voto

Simon Ferquel Points 201

J'ai utilisé unique_ptr à mettre en œuvre un préaffectés pools de mémoire utilisée dans un moteur de jeu. L'idée est de fournir préaffectés pools de mémoire utilisée à la place d'allocations dynamiques pour le retour de collision demandes de résultats et d'autres trucs comme la physique des particules, sans avoir à allouer / libère la mémoire à chaque image. C'est assez pratique pour ce genre de scénarios où vous avez besoin de pools de mémoire à allouer des objets à durée de vie limitée (en général un, 2 ou 3 images) qui ne nécessite pas la destruction de la logique (mémoire de libération de la mémoire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X