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 :

Inlining des getters / setters auto avec GCC?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut Inlining des getters / setters auto avec GCC?
    Bonjour,

    J'ai écrit un algo de clustering en C++ et je cherche à l'optimiser un minimum. Toutefois je me pose une questions concernant les getter/setter de mes classes. Ce sont en majorité de simples "return x" et "x ="

    Ai-je besoin de les déclarer inline ou est-ce que ce genre de chose est automatique lorsqu'on utilise GCC avec les optimisations niveau 2 activées?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 639
    Par défaut
    Salut,

    Je commencerais déjà par me poser la question de l'utilité de la plupart de ces fonctions.

    Si, effectivement, un accesseur est de temps en temps utile pour permettre la récupération d'une propriété, un mutateur "simple" ne me semble que rarement adapté

    Ceci dit, l'inlining respecte des règles bien précises:

    • Lorsque tu définis une fonction au sein même de la définition d'une classe, la fonction est réputée être implicitement déclarée inline
    • Pour les autres, seules les fonctions explicitement déclarées inline seront réputées comme telles.
    Si je parle de fonction réputées inline, c'est parce que le mot clé ne fait encore que demander au compilateur de les implémenter de manière inline, mais qu'il reste libre de décider de le faire ou non

    Enfin, certaines options de compilation peuvent modifier la manière dont gcc va créer les fonctions inline

    Tu trouvera la plupart de ces options de compilation ici
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Merci je vais regarder cela.

    Toutefois je pense que dans mon cas l'encapsulation est nécessaire pour les raisons suivantes :

    - J'ai des setter qui déclenchent des mises à jour au sein de l'objet, c'est pas le cas de tous mais ça me semble un peu trash de mixer de l'accès public et du get/set au sein de mes classes.

    - Je souhaite pouvoir retourner mes membres sous forme de référence constantes, (même si je n'ai pas encore résolu tous les problèmes qui vont avec ce mode de faire...)

  4. #4
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Ok j'ai pu trouver la réponse à ma question là dedans.

    Il semble que j'ai le choix entre utiliser les options O3 ou finline-functions, ou alors déclarer explicitement inline (je voulais éviter car j'ai l'impression que ça pollue un peu mon .h mais soit).

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 639
    Par défaut
    Citation Envoyé par _skip Voir le message
    Merci je vais regarder cela.

    Toutefois je pense que dans mon cas l'encapsulation est nécessaire pour les raisons suivantes :

    - J'ai des setter qui déclenchent des mises à jour au sein de l'objet, c'est pas le cas de tous mais ça me semble un peu trash de mixer de l'accès public et du get/set au sein de mes classes.
    En toute honnêteté, je me méfie énormément des setters purs et simples:

    Si tu en viens à accepter, pour une raison ou une autre, que l'on aille modifier un membre sans vérifier la validité de la modification ou sans que la modification de ce membre n'entraine une mise à jour d'autres propriétés de l'objet, c'est sans doute qu'il n'y a aucune raison de vouloir "cacher" ce membre au "reste du monde" (et peut être qu'il est bon de se poser la question de l'utilité de ce membre dans la classe envisagée )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    Le seul avantage que j'y vois (pour le moment) c'est qu'étant une méthode de classe, on peut utiliser le polymorphisme dessus (dans la mère on sait que l'on veut modifier une propriété, dans une des filles ça peut correspondre à une affectation bête et méchante (mais faut bien la faire) et dans une autre à un calcul exotique et de multiples vérifications avant modification des attributs membres)

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 639
    Par défaut
    Citation Envoyé par CedricMocquillon Voir le message
    Le seul avantage que j'y vois (pour le moment) c'est qu'étant une méthode de classe, on peut utiliser le polymorphisme dessus (dans la mère on sait que l'on veut modifier une propriété, dans une des filles ça peut correspondre à une affectation bête et méchante (mais faut bien la faire) et dans une autre à un calcul exotique et de multiples vérifications avant modification des attributs membres)
    J'ai quand même, sans m'être accordé le temps de la réflexion sur le sujet, beaucoup de mal à imaginer une telle discordance entre deux classes suffisamment proches pour avoir un ancêtre commun

    De plus, j'adhère à l'idée que le simple usage de "set" dans le nom d'une fonction est généralement dangereux car trop "générique".

    C'est la raison pour laquelle tu remarquera que j'utilise les termes accesseurs et mutateurs plutôt que ceux de getter et setter
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 38
    Dernier message: 05/02/2015, 16h30
  2. Réponses: 49
    Dernier message: 02/02/2013, 02h10
  3. Réponses: 3
    Dernier message: 04/05/2012, 11h22
  4. Des getters er des Setters avec visual Studio 2005
    Par zghidi dans le forum Visual Studio
    Réponses: 9
    Dernier message: 27/02/2008, 13h37
  5. [Template] Changer la génération des getter/setter
    Par anthyme dans le forum NetBeans
    Réponses: 2
    Dernier message: 05/07/2007, 09h26

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