IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Passage par copie vs passage par référence


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut Passage par copie vs passage par référence
    Bonsoir à tous,

    Juste une petite question concernant le choix entre l'utilisation du passage de paramètres par référence et celui par copie. Pour les objets de grande taille, aucun problème, la réponse est évidente. Par contre pour ceux de petite taille, c'est plus délicat. D'après ce que j'ai pu lire, le passage par copie est préférable pour les types de base tels int ou double, car le proc peut utiliser un registre pour stocker cette valeur plutôt que de l'allouer sur la stack.

    Maintenant qu'en est-il des objets genre complex (deux doubles) ? A priori cet objet sera alloué sur la pile s'il est copié, donc une référence semble plus apropriée. Pourtant l'implémentation du type complex de la librairie standard préfère le passage de complex par copie (pour les opértateurs arithméthiques par exemple). Y'a-t-il une raison à ce choix et une réelle modification des performances ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Il y a un juste équilibre à trouver entre la sécurisation des données et les performances, puisque passer les paramètre par copie offre la sécurité de ne pas rallonger la portée des données outre mesure (sécurité face à l'erreur de programmation donc).

    L'équilibre a été estimé en faveur du passage par recopie en ce qui concerne les complexes.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    La "sécurité" dont tu parles n'a de sens que dans un environnement multithréadé si la donnée passée est une entité pouvant évoluer. Ou que l'on ne trouve rien de mieux que de stocker une référence vers cette dernière. Dans ce dernier cas, il faut juste réfléchir aux dépendances. C'est exactement pareil que de garder des pointeurs.

    C'est au nouveau du double double (sic) que je commence à faire un coup d'une façon, un coup de l'autre. Probablement parce que je ne me suis pas amusé à faire des mesures de perfs.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Il y a aussi des désavantages d'un point de vue performance à utiliser le passage par référence: les accès ont une indirection supplémentaire; donc le choix optimal peut être dépendant de l'implémentation de la fonction.

    A mon avis, c'est typiquement le genre de choix qui devrait être laissé au compilateur (comme en Ada où le compilateur peut passer les paramètre in par valeur ou référence comme il veut -- sauf quelques exceptions comme les types limités où le passage par référence est obligatoire) et à ceux qui définissent l'ABI, car ils sont les seuls qui disposent réellement de l'information nécessaire pour choisir.

    A noter en ce qui concerne l'utilisation des registres pour le passage des paramètres que rien n'interdit au compilateur d'implémenter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void f(C obj) {
       ...
    }
    comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void f(C& _obj) {
    C obj(_obj);
       ...
    }
    Ce qui a au moins l'avantage de pouvoir diminuer la taille du code généré (et donc la pression sur les caches).

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Je vois encore d'autres critères qui peuvent influencer sur le choix d'un passage par référence ou par valeur:

    -Si le paramètre est un template (99% des cas dans mes programmes), il vaut mieux faire un passage par référence étant donné qu'on ne connait pas (a priori) la taille du paramètre

    -Si le temps d'appel de la fonction n'est pas négligeable par rapport à son temps d'exécution, alors c'est probablement une fonction qui pourrait/devrait être inlinée. J'ai déjà visualisé le code généré par mon compilo (Intel Compiler) pour les 2 types de passages sur des fonctions inlines: il ne fait aucune différence car tout est géré dans les registres.


    Dans l'ensemble, je dirais qu'il faut passer:
    - les types simples par valeur
    - tout le reste par référence

    Mais si tu veux en avoir le coeur net sur ton programme, rien ne remplacera une mesure des temps d'exécution

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    A ce sujet, pour les types simple, je crois que Boost propose un type templaté adapté - si le compilo le supporte -, ce qui permet d'activer le passage par référence ou pas selon le paramètre, justement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Passage crossprojet d'un workbook par référence
    Par oasisllc dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/01/2013, 10h42
  2. Réponses: 6
    Dernier message: 20/01/2013, 14h08
  3. Passage de paramètres par adresse ou par copie ?
    Par EpiTouille dans le forum Langage
    Réponses: 6
    Dernier message: 24/12/2011, 10h31
  4. Passage de variables en POST par un lien
    Par Nious99 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/06/2006, 08h52
  5. Réponses: 8
    Dernier message: 10/03/2006, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo