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

Langage C++ Discussion :

Comment retourner une chaîne de caractère en évitant autant que possible la copie ?


Sujet :

Langage C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut Comment retourner une chaîne de caractère en évitant autant que possible la copie ?
    Bonjour à tous,

    Je me retrouve une nouvelle fois face à un code contenant des fonctions retournant des chaînes de caractères. Malheureusement (pour moi et surtout pour les performances) celles-ci sont retournées par copie. Un des soucis qui m'empêche de retourner une référence est le fait qu'il existe des cas où ces fonctions peuvent retourner des chaînes vides : return "";.

    Quelles solutions avez-vous pour éviter des copies ?

    Mes solutions :
    • passer la chaîne de caractère par référence en argument à la fonction. Point noir : modification lourde du code existant ;
    • utiliser une chaîne vide statique, qui ne sera pas détruite, même lorsque retournée par la fonction.


    Exemple de code problématique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::string myFct()
    {
        if (test)
            return member;
     
        return "";
    }
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Quel est le problème avec la chaîne vide ? Elle est statique (et devrait être constante) alors la non destruction n'a aucune importance puisqu'elle doit survivre jusqu'à la fin du programme.
    Bien sûr, les retours devront être des références constantes, à la charge de l'appelant de réduire les copies en utilisant aussi des références.

    PS: le constructeur par défaut s'utilise avec {} et non pas "".

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Dans ce genre de cas j'opte pour la static et le retour par const& s'il n'est pas possible de retourner directement par const char*Les cas les plus tordus, ou s'y prétant, peuvent se contourner en retournant un bool et la string en paramètre out
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Pareil que Bousk.
    C'est ce que j'ai fait il n'y a pas longtemps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::string const& C::f() const {
        static const std::string k_empty;
        if (foo) return m_bar;
        return k_empty;
    }
    Et si tu veux reconnaitre une chaine vide précise (car elle pourrait vouloir dire "pas trouvé" et pas juste "trouvé mais vide"), il faut la sortir de sa portée locale.

    NB: je n'ai pas étudié la pertinence de retourner une string_view dans ces cas là.
    Hum... Cela m'a l'air d'être un sacré progrès à vue de nez.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::experimental::string_view C::f() const {
        if (foo) return m_bar;
        return std::experimental::string_view{};
    }
    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...

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Ok, merci pour m'avoir éclairci ce point.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [FAQ] Comment tester une chaîne de caractères avec une expression régulière ?
    Par Baptiste Wicht dans le forum Vos Contributions VBScript
    Réponses: 1
    Dernier message: 20/11/2007, 19h43
  2. Réponses: 4
    Dernier message: 22/12/2006, 15h10
  3. Réponses: 1
    Dernier message: 01/11/2006, 19h20
  4. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58
  5. Réponses: 5
    Dernier message: 15/02/2005, 18h07

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