Je me demandais pourquoi les modèles vectoriels effectuent deux allocations, alors qu'une seule semble être nécessaire.Allocations vectorielles STL
Par exemple ceci:
#include <vector>
#include <iostream>
class A {
public:
A(const A &a) {
std::cout << "Calling copy constructor " << this << " " << &a << "\n";
}
A() {
std::cout << "Calling default constructor " << this << "\n";
}
~A() {
std::cout << "Calling destructor " << this << "\n";
}
};
int main(int argc, char **argv)
{
std::vector <A> Avec;
std::cout << "resize start\n";
Avec.resize(1);
std::cout << "resize end\n";
return 0;
}
Sorties:
resize start Calling default constructor 0x7fff9a34191f Calling copy constructor 0x1569010 0x7fff9a34191f Calling destructor 0x7fff9a34191f resize end
Je pense cela fera aussi deux allocations: - Un pour le nouveau A() - Un pour la copie de push_back() – ynimous
@ynimous: Pas vraiment, le code ci-dessus change la sémantique pour que le vecteur contienne des pointeurs. Il créera un élément A une seule fois, alors qu'il créera et copiera le pointeur (ce qui est supposé être plus rapide). –
Le problème avec cette approche est que vous changez la sémantique du code. Avant que les objets ne soient maintenus en valeur à l'intérieur du vecteur, la destruction du vecteur impliquait la destruction de tous les éléments contenus. Maintenant que les éléments sont maintenus à travers un pointeur, le code doit être adapté et l'utilisateur doit détruire toutes les ressources (objets A) manuellement. Tandis que vous avez réduit le nombre de constructions A, le code est maintenant plus fragile et sujet aux fuites de ressources. –