``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 ?
``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 ?
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.
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écutionarray
ne permet que la taille pour être spécifiée au moment de la compilationLe redimensionnement
array
et unique_ptr<T[]>
ne permettent pas de redimensionnementvector
neDe 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'objetLa copie
array
et vector
permettre la copieunique_ptr<T[]>
ne permet pas la copieSwap/déplacer
vector
et unique_ptr<T[]>
ont O une fois(1) swap
et les opérations de déplacement dearray
a O(n) fois swap
et les opérations de déplacement, où n est le nombre d'éléments dans le tableauPointeur/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 Conteneursunique_ptr<T[]>
n'est pas un ConteneurJe dois admettre, il se présente comme une opportunité pour certains de refactoring avec la politique de base de la conception.
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
.
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 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.