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 :

C++ : passer par reference pour optimiser ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut C++ : passer par reference pour optimiser ?
    Bonjour je cherche a optimiser un peu mon code par ci par là...
    j'ai lu quelques part que pour les types non triviaux (int) il est interessant de passer par ref...
    alors voilà,
    est-ce que c'est interessant de transformer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Uint16 Str2Uint(std::string x)
    {
        std::istringstream iss(x);
        long nombre;
        iss >> nombre;
        return nombre;
    }
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Uint16 Str2Uint( const std::string & x )
    {
        std::istringstream iss(x);
        long nombre;
        iss >> nombre;
        return nombre;
    }
    est-ce que ca donnerait du code plus optimisable par le compilo ?
    merci.

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    C'est surtout que dans ton premier code .. tu passe par copie... dans un ca extreme .. si ta chaine fait des millier de caractère... tu copie les milliers de caractères ...

    Par référence .. pas de copie vu que c'est le même objet

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    ok, mais si mais chaine ne fait qu'une dixaine de caracteres maximum a chaque fois (là c'est pour convertir en entier, donc elle n'est jamais si grande)
    est-ce que c'est viable ? (parceque du coups on a un déreferencement supplementaire)
    en fait mes chaines sont petitte c'est vrai, mais j'appelle baucoups cette fonction... donc même un gain faible est interessant.
    merci.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Prendre ta variable locale par copie signifie qu'elle sera construite et détruite, soit une allocation dynamique et une désallocation (appel de new et delete). Et entre les deux, recopie de tous les caractères.

    Tout ce petit monde sera facilement plus lourd qu'une simple indirection supplémentaire.

    Petit conseil supplémentaire : c'est le genre de fonction qui se prête bien à l'inlining (surtout si tu fais beaucoup d'appels).

    Autre chose mais qui n'a rien à voir avec les performances : pourquoi utiliser un long pour le renvoyer en Uint16 ? Pourquoi ne pas faire une fonction template ?

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    oui, merci pour le long, c'est vrai je l'avais laissé passé celui-la (voilà ce que c'est de copier/coller une fonction toute faite ).
    Merci pour l'idée du template mais tout est Uint16 dans mon code.

    inliner, oui tiens justement, j'ai une question car je comptait bien l'inliner cette fonction...
    inliner revient à mettre le code de la fonction directement, c'est bien ca ? alors du coups a quoi sert le passage des arguments ? je veux dire est-ce important de passer par pointeur, par reference ou par valeur puisque qu'en fait il n'y aura pas d'appel de fonction ? c'est une question que je me pose depuis quelques temps, de partout je lis les avantages de l'inline mais le mecanisme n'est pas expliqué...

    Merci d'avance.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Le passage d'un paramètre à une fonction entraine l'initialisation d'une variable locale, que la fonction soit inline ou pas. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    inline Uint16 Str2Uint(std::string x)
    {
        std::istringstream iss(x);
        long nombre;
        iss >> nombre;
        return nombre;
    }
     
    int main(int argc, char* argv[])
    {
      return Str2Uint(argv[1]);
    }
    va être transformer par le compilateur en quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(int argc, char* argv[])
    {
      std::string x(argv[1]);
      std::istringstream iss(x);
      long nombre;
      iss >> nombre;
      Uint16 retour = nombre;
      return retour;
    }
    ensuite l'optimiseur fera son boulot et enlèvera, notamment, les variables temporaires inutiles.

    Donc même pour une fonction inline, le passage par copie ou par référence à de l'importance. De plus inline n'est qu'un conseil donné au compilateur, qu'il n'est pas obligé de tenir.

Discussions similaires

  1. Combien de colonnes par table pour optimiser ma base ?
    Par Nicobp dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/01/2013, 18h51
  2. [Langage] Passer par reference un tableau de int
    Par sn@ke51 dans le forum Langage
    Réponses: 10
    Dernier message: 03/12/2008, 11h02
  3. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  4. Réponses: 22
    Dernier message: 17/02/2006, 11h51
  5. Configuration pour ne pas passer par le proxy
    Par Worldofdada dans le forum JWS
    Réponses: 5
    Dernier message: 10/11/2005, 19h54

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