|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
Bonjour, prenons le code suivant:
Code :
Citation:
Pourquoi fait-il cette copie? Comment l'éviter (étant entendu que l'on ne connait pas à l'avance le nombre d'éléments que l'on va mettre dans le vecteur)? |
|||
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
std::vector gère la vie de ses objets et en fait donc une copie.
De plus, std::vector gère un tableau dynamique. Lorsque la taille du tableau est trop petite, il en alloue un nouveau et recopie tous les éléments. Il faut utiliser un std::vector de pointeurs intelligents. |
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 551 ![]() |
Ici:
Tu as qui construit l'objet, qui est un objet temporaire. Puis l'objet temporaire est passe a push_back qui copie cet objet dans l'array que le vector gere. Par contre, il me semble que certains compilos vont eliminer la copie si tu compile en optimise (pas en Debug). Cela dis ce n'estpas garanti. En C++03, ce n'est pas possible de garantir qu'il ny aura pas cette copie. En revanche, C++11 offre une solution. Code :
v.emplace_back( /* arguments du constructeur de Foo ici */ ); Ca resouds le probleme. Mais il faut un compilateur et une bibliotheque standard C++11. |
|
10
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
Citation:
![]() Je viens de tester sur vs 2010, mais visiblement il y a une limitation: emplace_back prend un et un seul argument (donc pas possible d'utiliser directement avec des constructeurs prenant zero ou plusieurs arguments). Limitation facile à contourner, mais limitation tout de même. D'ailleurs, peut-être que couplé avec une inplace_factory de boost, ça pourrait donner des trucs assez magiques |
|
|
|
00
|
|
|
#5 | |||
|
Membre habitué
![]() Inscription : mars 2010 Messages : 114 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : mai 2008 Messages : 937 ![]() |
Dans le standard emplace_back peut prendre un nombre arbitraire d'argument mais, sur vs2010, vu l’absence de template variadique microsoft a implémenté une version restreinte d'emplace_back qui ne prend qu'un seul argument. (c'est un peu mieux sur vs2012 où l'on peut aller jusqu'à 4 arguments)
|
|
|
10
|
Copyright © 2000-2013 - www.developpez.com