Référence

Référence - C++ - Programmation

Marsh Posté le 14-09-2004 à 03:49:49    

Petite question sur les références
 
quand est-ce que les références ne servent pas?
 
pour un int, l'exemple que plusieurs on se demandait, nous fait il sauver de l'allocation, ca reste pareil que si on faisait un passage par valeur, ou encore c'est pire qu'un passage par valeur?
 
en gros quels sont les cas qu'on ne doit pas utiliser le passage par référence
 
merci encore une fois

Reply

Marsh Posté le 14-09-2004 à 03:49:49   

Reply

Marsh Posté le 14-09-2004 à 10:20:55    

Tu veux dire un passage par référence constante ?
 
genre :  

Code :
  1. void Fonction(const T & t);


 
Parce que un passage par référence, tu peux modifier ta valeur, alors qu'un passage par valeur, tu ne peux pas.
 
Sinon, pour répondre, dans tous les cas où tu as un type de base (entiers, flottants, pointeurs, bool), un passage par référence constante ne sert à rien ou presque. Dans tous les cas où tu passes un objet (structure, union, classe), ça peut être plus efficace, voire même beaucoup plus efficace (std::string en est un bon exemple, puisque le constructeur de recopie alloue de la mémoire).  
 
Attention, si tu es susceptible de modifier l'objet entre temps (thread ou appel asynchrone), l'utilisation d'une référence peut être dangereux.

Reply

Marsh Posté le 14-09-2004 à 13:37:34    

Lam's a écrit :

Tu veux dire un passage par référence constante ?
 
genre :  

Code :
  1. void Fonction(const T & t);


 
Parce que un passage par référence, tu peux modifier ta valeur, alors qu'un passage par valeur, tu ne peux pas.
 
Sinon, pour répondre, dans tous les cas où tu as un type de base (entiers, flottants, pointeurs, bool), un passage par référence constante ne sert à rien ou presque. Dans tous les cas où tu passes un objet (structure, union, classe), ça peut être plus efficace, voire même beaucoup plus efficace (std::string en est un bon exemple, puisque le constructeur de recopie alloue de la mémoire).  
 
Attention, si tu es susceptible de modifier l'objet entre temps (thread ou appel asynchrone), l'utilisation d'une référence peut être dangereux.


 
mouep c'est ca que je veux dire. dans le cas où je dois pas le modifier, bin tu le passe par référence en const
 
mais je voulais savoir exactement, avec quel type on est perdant, avec lesquelles on est égal. (int égal ou perdant? bool égal ou perdant?)
 
merci

Reply

Marsh Posté le 14-09-2004 à 13:49:41    

bah implicitement, si je dis pas de bêtises, le compilo devrait passer une adresse.
donc c'est moins rentable si le type a une taille plus petite que la taille d'une adresse du cpu. (genre char/short int).
 
ce qui pourrait permetttre de dire que c'est un peu une prise de tête pour rien, c'est que un char ou int ça consomme quand même un registre (la différence se fairait que par rapport à la pile).
 
et que si ta fonction est inlinée, bah on s'en fous, si le compilo optimise bien, c'est transparent car ce n'est que de "l'écriture source".

Reply

Marsh Posté le 14-09-2004 à 13:51:25    

bjone a écrit :

bah implicitement, si je dis pas de bêtises, le compilo devrait passer une adresse.
donc c'est moins rentable si le type a une taille plus petite que la taille d'une adresse du cpu. (genre char/short int).


sans oublier le déréférencement...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-09-2004 à 13:52:34    

pour le inlinée, jsuis pas vraiment au courant de ce que c'est, mais vu que tu viens de le mentionné, je tâcherai de lire un peu sur ca
 
donc je passe par référence sans trop me préocupper du type en me disant que le compilo est pas con
 
merci

Reply

Marsh Posté le 14-09-2004 à 13:59:43    

avec l'inline, c'est juste que le compilo fusionne tout de manière optimale.
 
par exemple:
 
inline void fadd( int &a, int b)
{
   a+=b;  
}
 
yop()
{
   int c,d;
   cin>>c>>d;
   fadd(c,d);
   cout<<c;
}
 
produira potentiellement le même code machine que:
 
yop()
{
   int c,d;
   cin>>c>>d;
   c+=d;
   cout<<c;
}
 
ce qui permet d'éclater ton code proprement en fonctions isolées, sans avoir les pénalitées d'appel/retour (et le compilo fusionne les instructions et produit un flux optimisé).
 
par exemple dans une classe:
 
class Truc
{
private:
   size_t Size;
public:
  inline size_t GetSize()
  {
    return Size;
  }
};
 
fait que le GetSize() compte comme du beurre (ie pas de coût d'appel/retour de fonction, comme si tu faisais un Truc.Size), et permet de protéger Size.

Reply

Marsh Posté le 14-09-2004 à 14:02:21    

mais attention l'inilining ne peut fonctionner qu'avec des méthodes de classes implémentées dans la définition de la classe (dans le header quoi), ou des fonctions qui sont dans le même fichier c/cpp (ie le compilo a accès à l'implémentation de toutes les fonctions candidates à l'inlining).

Reply

Marsh Posté le 14-09-2004 à 14:05:31    

bjone a écrit :

mais attention l'inilining ne peut fonctionner qu'avec des méthodes de classes implémentées dans la définition de la classe (dans le header quoi), ou des fonctions qui sont dans le même fichier c/cpp (ie le compilo a accès à l'implémentation de toutes les fonctions candidates à l'inlining).


 
En fait, avec VS7, si tu actives le "whole program optimization" l'inlining a une portée plus grande (par contre ca peut te foutre le bronx dans tes objs existants, cf msdn)

Reply

Marsh Posté le 14-09-2004 à 14:06:44    

Lam's a écrit :

Dans tous les cas où tu passes un objet (structure, union, classe), ça peut être plus efficace, voire même beaucoup plus efficace (std::string en est un bon exemple, puisque le constructeur de recopie alloue de la mémoire).


 
si seulement... mais malheureusement, la quasi-totalité des implémentations utilisent un constructeur par recopie des std::string qui incrémente un compteur de référence. La mémoire est dupliquée et recopiée uniquement lorsque l'une des référence à la chaine de caractère sous jacente est modifiée.
Dans beaucoup d'utilisations, c'est efficace ; par contre, c'est un plaie dans les applications multithread, car source de nombreux plantages. A manier avec moultes précautions...


Message édité par SoWhatIn22 le 14-09-2004 à 14:07:17
Reply

Marsh Posté le 14-09-2004 à 14:06:44   

Reply

Marsh Posté le 14-09-2004 à 14:13:17    

chrisbk a écrit :

(par contre ca peut te foutre le bronx dans tes objs existants, cf msdn)


As-tu un lien qui parle de ce bronx ?
 
Pour std::string et la COW, le futur semble se tourner vers l'abandon de cette technique vu qu'aparement le standard empêche cette pratique. VC++ >= 7 n'utilise plus le compteur de ref, mais limite le cout d'une allocation grâce à un petit buffer interne de 16 octets qui stocke les petites chaînes.


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

Marsh Posté le 14-09-2004 à 14:16:51    

dans mon cas c'est que pour un petit tp, alors je regarderai une fois que tout sera terminé pour ajouté de l'inline, ca semble bien
 
ca me fera p-e gruger quelques points bonus, j'utilise déjà les vector au lieu de me déclarer un énorme tableau (du genre Segment tab[100000]) lorsqu'il peut n'y avoir que 5 segments

Reply

Marsh Posté le 14-09-2004 à 14:37:27    

sinon, la pluspart des compilos proposent une option d'auto-inlining.
 

Reply

Marsh Posté le 14-09-2004 à 14:38:42    

tu genre que t'es pas obligé de mettre tes fonctions en inline, et g++ le fera à chaque fois qu'il en aura l'occasion avant (ou pendant même) sa compilation?
 
interressant

Reply

Marsh Posté le 14-09-2004 à 15:26:34    

HelloWorld a écrit :

As-tu un lien qui parle de ce bronx ?
 


 
ben  
 
http://msdn.microsoft.com/library/ [...] zation.asp
 

Citation :


The format of files produced with /GL in the current version may not be readable by subsequent versions of Visual C++. You should not ship a .lib file comprised of .obj files that were produced with /GL unless you are willing to ship copies of the .lib file for all versions of Visual C++ you expect your users to use, now and in the future.
 
.obj files produced with /GL and precompiled header files should not be used to build a .lib file unless the .lib file will be linked on the same machine that produced the /GL .obj file. Information from the .obj file's precompiled header file will be needed at link time.

Reply

Marsh Posté le 14-09-2004 à 15:36:36    

Ah okay. J'avais compris que ça pouvais mairdouiller sur ton propre projet.


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

Sujets relatifs:

Leave a Replay

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