remplissage d'un vector - perfs

remplissage d'un vector - perfs - C++ - Programmation

Marsh Posté le 03-03-2010 à 11:01:22    

Salut à tous,  
 
je cherche à vider puis remplir un vector, et j'hésite entre ces méthodes :  
 

Code :
  1. //methode 1
  2. std::vector<Objet> toto.clear();
  3. toto.resize(N);
  4. for(int i = 0 ; i < N ; ++i)
  5. toto[i] = valeur;
  6. //methode 2
  7. toto.clear();
  8. for(int i = 0 ; i <N ; ++i)
  9. toto.push_back(valeur);
  10. //methode 3
  11. toto.resize(N);
  12. for(int i = 0 ; i <N ; ++i)
  13. toto[i] = valeur;


 
Quelles vont être les différences en termes de comportement et en termes de perfs entre ces trois méthodes? Est-ce que ça dépend de la classe Objet, du nombre de bitogniots que je mets dans le vecteur?

Reply

Marsh Posté le 03-03-2010 à 11:01:22   

Reply

Marsh Posté le 03-03-2010 à 13:24:46    

Reply

Marsh Posté le 03-03-2010 à 13:28:04    

A adapter parce qu'il connait ce avec quoi il veut reinitialiser.  Donc:
 

Code :
  1. std::vector<Object>(N, valeur).swap (toto);


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 03-03-2010 à 13:29:22    

oui ofc :jap:

Reply

Marsh Posté le 03-03-2010 à 14:46:06    

lorsque c'est pour remplir le tableau une première fois et avec des données arbitraires, plutôt que de faire un resize puis des accès directs aux données, j'aurais tendance à préférer faire un reserve puis des push_back.
Après, pour initialiser N éléments à la même valeur quand on part d'un tableau avec une taille différente, effectivement, le swap ne fait pas trop de doute.
 
Si les objets que tu manipules ont des effets de bord à la construction et destruction, fais bien attention parce que tu vas obtenir des comportements très différents suivant la solution employée.


---------------
last.fm
Reply

Marsh Posté le 03-03-2010 à 15:59:50    

Un Programmeur a écrit :

A adapter parce qu'il connait ce avec quoi il veut reinitialiser.  Donc:
 

Code :
  1. std::vector<Object>(N, valeur).swap (toto);



 
Tu te retrouve avec un pic d'allocation mémoire qui cumule l'ancien et le nouveau vector.
Si c'est pas problématique ça va, après si c'est un bon gros vector bien lourd de plusieurs dizaines, centaines de Mo, (genre une image, un buffer audio, ou moultes échantillons divers ou autres trucs), c'est pas forcément glop. (donc le swap avec un truc vide, puis un resize)
 
Après dans certains cas, chercher a ramener absolument la capacité au nombres d'éléments c'est pas forcément une bonne idée: par exemple dans le cas d'une queue d'éléments a traiter, souvent avec le même nombre d'éléments pour une question de cohérence temporelle et/ou spatiale (les objets en vue dans un moteur 3d: d'une frame à l'autre le nombre d'éléments sera très fréquemment le même).

Reply

Marsh Posté le 03-03-2010 à 19:16:49    

sauf que les compilso vont très certainement faire des elisions sur les allcoations et les copies (cf article de abrahams sur le sujet).
 
swap est devenu tres tres interessant de nos jours.

Reply

Marsh Posté le 08-03-2010 à 10:17:33    

Est-ce que pour faire ça je dois définir Objet::swap() ? Et si oui, à quoi je dois prendre garde quand je le fait?

Reply

Marsh Posté le 08-03-2010 à 11:07:23    

oui, il vaut mieux. Le plus simple est de l'ecrire en utilisant std::swap (ou boost::swap)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed