Meilleure méthode pour utiliser un vecteur dans une fonction

Meilleure méthode pour utiliser un vecteur dans une fonction - C++ - Programmation

Marsh Posté le 07-06-2003 à 17:25:42    

Le sujet est pas très clair je pense, alors je précise:
 
Donc j'ai un vecteur que j'ai rempli... Appellons le Vect1.
 
Je le fais passer dans une fonction, qui se sert de ses éléments pour effectuer un autre traitement...
 
Dans cette fonction, il est juste lu, et en aucun cas modifié.
 
Comment le déclarer correctement dans la déclaration de fonction:
 
void Fonction(Vect1);
 
ou bien void Fonction(const & Vect1);
 
ou autre chose, si vous qui me dites...
 
Parce ce que j'ai lu quelque part que la 2ème méthode est meilleure dans le sens où elle ne crée pas de copie du vecteur pour travailler...
 
Merci!!


---------------
Another .Net Blog
Reply

Marsh Posté le 07-06-2003 à 17:25:42   

Reply

Marsh Posté le 07-06-2003 à 17:51:01    

const &
c'est toujours mieux.

Reply

Marsh Posté le 07-06-2003 à 17:55:33    

ok, merci...


---------------
Another .Net Blog
Reply

Marsh Posté le 07-06-2003 à 18:51:44    

Et ce type de déclaration, il faut le faire pour tous les types?
 
Ex: void Fonction (const int & Valeur) { toto = Valeur; }
 
Ou bien on la limite seulement aux conteneurs (le terme est juste?) tels que vector, tableaux??


---------------
Another .Net Blog
Reply

Marsh Posté le 07-06-2003 à 20:50:28    

Non, ce n'est pas nécessaire ...
 
L'un des intérêts de passer par des références est d'éviter de coller des structures/classes dans la pile, ce qui la saturerait trop vite ... On ne passe donc qu'un pointeur sur la structure ...


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

Marsh Posté le 07-06-2003 à 21:02:12    

Les vecteurs ne sont pas passés par défaut par référence?

Reply

Marsh Posté le 07-06-2003 à 22:37:45    

C'est fort possible ... Je n'en sais rien, mais je parlais de généralités, d'où ma précision structures / classes, qui, elles, sont dupliquées.


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

Marsh Posté le 10-06-2003 à 15:31:51    

Belgique a écrit :

Les vecteurs ne sont pas passés par défaut par référence?


 
Si logiquement Vect1 correspont à l'adresse du premier element du vecteur, donc ca revient au même dans ce cas la. Enfin je pense quand même que (const &Vect1) est plus clair et en plus ca permet de s'y habituer pour la suite avec les classes et les structures.

Reply

Marsh Posté le 10-06-2003 à 15:58:14    

piemur2000 a écrit :


 
Si logiquement Vect1 correspont à l'adresse du premier element du vecteur, donc ca revient au même dans ce cas la. Enfin je pense quand même que (const &Vect1) est plus clair et en plus ca permet de s'y habituer pour la suite avec les classes et les structures.


Le probleme, c'est que tu n'en sais rien si "Vect1 correspont à l'adresse du premier element du vecteur". On ne parle pas de tableau mais de vecteur, et plus généralement de conteneur, ce qui n'a rien à voir.
 
En général, le constructeur par recopie d'un container de la STL ne copie pas tous les objets qu'il contient, mais modifie juste un compteur de références. Une copie sera réellement réalisée seulement si la copie est modifiée.


Message édité par SoWhatIn22 le 10-06-2003 à 15:59:11
Reply

Marsh Posté le 10-06-2003 à 16:28:57    

sowhatin22 a écrit :


Le probleme, c'est que tu n'en sais rien si "Vect1 correspont à l'adresse du premier element du vecteur". On ne parle pas de tableau mais de vecteur, et plus généralement de conteneur, ce qui n'a rien à voir.
 
En général, le constructeur par recopie d'un container de la STL ne copie pas tous les objets qu'il contient, mais modifie juste un compteur de références. Une copie sera réellement réalisée seulement si la copie est modifiée.


 
Toutefois je pense que c plusqu'une adresse qui passe alors par la pile donc mieux vaut passer une référence.


---------------
Le Tyran
Reply

Marsh Posté le 10-06-2003 à 16:28:57   

Reply

Marsh Posté le 10-06-2003 à 19:51:58    

sowhatin22 a écrit :


En général, le constructeur par recopie d'un container de la STL ne copie pas tous les objets qu'il contient, mais modifie juste un compteur de références. Une copie sera réellement réalisée seulement si la copie est modifiée.


 
 
Euh non, je crois pas ( /usr/include/c++/3.3/bits/stl_vector ) :  

Code :
  1. /**
  2.        *  @brief  %Vector copy constructor.
  3.        *  @param  x  A %vector of identical element and allocator types.
  4.        *  
  5.        *  The newly-created %vector uses a copy of the allocation
  6.        *  object used by @a x.  All the elements of @a x are copied,
  7.        *  but any extra memory in
  8.        *  @a x (for fast expansion) will not be copied.
  9.        */
  10.       vector(const vector& __x)
  11.       : _Base(__x.size(), __x.get_allocator())
  12.       { _M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start); }

 
 
Les mécanismes de la stl restent très très basiques, pas de copy-on-write et autres.

Reply

Marsh Posté le 11-06-2003 à 08:01:46    

Captain ad-hoc a écrit :


Les mécanismes de la stl restent très très basiques, pas de copy-on-write et autres.


Autant pour moi, ce méchanisme n'est utilisé que pour les string mais pas pour les autres conteneurs.

Reply

Marsh Posté le 11-06-2003 à 09:14:43    

Citation :

Les vecteurs ne sont pas passés par défaut par référence?  
theShOcKwAvE  


 

Citation :

C'est fort possible ... Je n'en sais rien, mais je parlais de généralités, d'où ma précision structures / classes, qui, elles, sont dupliquées.


 
Pourquoi (et comment ?) un vecteur (ou autre ?) serait passé par défaut par référence ?
J'ai toujours vu que le C++ comme le C passe par valeur, sauf si passage par référence explicité en C++ avec &.
Passage par valeur => recopie du vector ... ou alors j'ai loupé un truc (optimisation de certains compilos ?).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-06-2003 à 09:21:42    

HelloWorld a écrit :

Citation :

Les vecteurs ne sont pas passés par défaut par référence?  
theShOcKwAvE  


 

Citation :

C'est fort possible ... Je n'en sais rien, mais je parlais de généralités, d'où ma précision structures / classes, qui, elles, sont dupliquées.


 
Pourquoi (et comment ?) un vecteur (ou autre ?) serait passé par défaut par référence ?
J'ai toujours vu que le C++ comme le C passe par valeur, sauf si passage par référence explicité en C++ avec &.
Passage par valeur => recopie du vector ... ou alors j'ai loupé un truc (optimisation de certains compilos ?).


 
Tu pourais avoir un mécanisme de lazy recopy par exemple. Maintenent comem je suis jamais aller voir dans le code (et j'en ai pas envie avec la STL) je suppose que c pas le cas et je passe par référence.


---------------
Le Tyran
Reply

Marsh Posté le 11-06-2003 à 12:48:53    

Certes, mais on parle du passage de paramètres, et pas du code du vecteur. Et étant donné que c'est la STL, même si certaines implémentations utilisent le COW, rien ne garanti (à ma connaissance) un passage "par référence".


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-06-2003 à 13:04:55    

HelloWorld a écrit :

Certes, mais on parle du passage de paramètres, et pas du code du vecteur. Et étant donné que c'est la STL, même si certaines implémentations utilisent le COW, rien ne garanti (à ma connaissance) un passage "par référence".


 
 :jap: tout à fait d'accord.


---------------
Le Tyran
Reply

Sujets relatifs:

Leave a Replay

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