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 :

Bonnes pratiques vis à vis des fonctions inline ?


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Bonnes pratiques vis à vis des fonctions inline ?
    Bonjour.

    J'avais 2 questions à propos des fonctions inline :
    1) Dans quels fichiers déclarer les fonctions inline ? Dans les .h ou dans les .cpp ?
    2) A quoi se limiter au niveau des fonctions inline ?
    Juste à 2/3 if et à des return ou cela peut être plus complexe ?
    De plus peut-on déclarer des variables (variables temporaire pour des calculs par exemple) dans une fonction inline ou cela n'a aucun sens et la fonction ne sera pas inlinée par le compilateur ?

    Merci

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 862
    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 862
    Points : 219 061
    Points
    219 061
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    1) Le corps de la fonction dans être le .h
    2) Pour les limites ... hum ... la dernière fois que nous avons parler des inline ici, ce fut un débat pour savoir si le mot clé était encore d'actualité. Personnellement, je ne sais toujours pas quand mettre inline ou pas, et je fais confiance à mon compilateur.

    Sinon, dans le principe, le inline équivaut à une copie de la fonction là où son appel est fait. Donc dans une fonction inline, on peut bien déclaré une variable.
    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.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

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

    Pour être précis sur la réponse à la première question, il faudrait dire: "dans un fichier qui sera inclus (de manière directe ou indirecte) dans le fichier dans lequel l'appel de la fonction sera effectué".

    La différence avec la réponse de LittleWhite est subtile, mais elle peut prendre toute son importance dans le cadre de fonctions (membres de classes) template, qui, elles, devront d'office être déclarée inline, que ce soit de manière implicite (parce que définies dans le corps de la classe template dont elles sont membres) ou explicite.

    Pour la deuxième réponse, on va faire simple: pour les fonctions particulièrement courtes (typiquement: mutateurs et accesseurs) et pour les fonctions (membres de classes) template.

    Pour les fonctions courtes, qui correspondent quasiment, comme LittleWhite l'a fait remarquer, à la déclaration d'une variable, il est plus que possible que la fonction sera effectivement inlinée.

    Pour les fonctions (membres de classes) template, c'est nécessaire pour:
    1. permettre au compilateur de produire le code binaire exécutable correspondant au type avec lequel la fonction est utilisée
    2. éviter à l'éditeur de liens de se plaindre du fait qu'il retrouve potentiellement plusieurs implémentation d'une même fonction (utilisant le même type) dans différents fichiers objets


    Pour les autres fonction, il faut savoir que la déclaration (implicite ou explicite) d'une fonction inline se "contente" d'indiquer au compilateur que tu souhaite que l'appel à la fonction soit remplacé par le corps de la fonction directement dans le code objet, mais qu'il n'a aucune obligation de s'y tenir.

    Il ne décidera d'inliner effectivement une fonction que si (et seulement si) le code binaire qu'elle représente demande moins d'un certains nombre (que l'on peut le cas échéans redéfinir avec l'option ad-hoc) d'instructions processeur .
    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

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Un dernier point : une fonction inline présentant sa définition peut amener à rajouter des dépendances entre des fichiers, dépendances qui relèvent du détail d'implémentation. Ce qui peut être assez embêtant en maintenance ou tout simplement en compilation.

  5. #5
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Ne pas les utiliser ?

  6. #6
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Citation Envoyé par Hylvenir Voir le message
    Ne pas les utiliser ?
    Là il faut que tu argumente parce que c'est vraiment pas commun comme proposition

    On peut rajouter qu'il est bon d'inliner des petites fonctions appelées très souvent mais à peu d'endroits différents.

    Personnellement je ne les met pas directement dans le .h, j'ajoute un fichier .inl (que le .h inclus tout à la fin) qui définit les fonctions inline. Je trouve ça plus clair, ça sépare la déclaration de la définition.

  7. #7
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Il le fera mieux que moi.

    http://www.gotw.ca/gotw/033.htm

  8. #8
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Pas vraiment convaincant

  9. #9
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Pas vraiment convaincant
    Sutter argumente quand même, j'en vois 2 :

    - Ne jamais faire d'optimisation (ici inilner) sans savoir où le besoin d'optimisation est localisé, c'est à dire après être passé par un profiler. Et toujours vérifier ses algos avant de s'attaquer à des micro-optimisation (comme passer une fonction inline). C'est un argument classique contre les micro-optimisation prématuré il me semble.

    Cette argument se base sur le fait qu'indiquer inline c'est dire au compilo : "tu peux inliner" et pas "tu dois inliner", et que donc on ne peut pas (ou plus exactement que ca serait une perte de temps) faire le raissonement inverse (tout inliner et désinliner au besoin).

    Il se base aussi sur le fonctionnement de l'inline pour montrer qu'il peut augmenter ou diminuer les perfs de ton programme (que ce soit taille ou vitesse).

    - Inliner induit un couplage fort, c'est un argument de conception assez fort : couplage fort = à éviter. (Il détaille plus cette idée dans un article sur l'héritage, et de manière général tout les concept OO tentent à réduire les couplage fort, ils induisent une rigidité du code impropre à l'évolution du programme).

    Finalement je trouve au contraire qu'il est plutôt convaincant, et la conclusion n'est pas "jamais inliné" mais éviter d'inliner (*) avant d'être certain que les perfs en profitent et que le design n'en patisse pas trop.

    (*) Sauf quand c'est obligatoire comme pour les fonction membre template.

Discussions similaires

  1. [Vxi3] Agrégation : bonnes pratiques pour cumuler des valeurs ?
    Par fprovot dans le forum Designer
    Réponses: 0
    Dernier message: 25/07/2013, 19h34
  2. Réponses: 0
    Dernier message: 16/07/2013, 09h39
  3. cacher l'implémentation des fonctions inline
    Par PyNub dans le forum Débuter
    Réponses: 27
    Dernier message: 28/08/2012, 19h28
  4. [Procédures stockées] Bonnes pratiques de gestion des erreurs
    Par jbrasselet dans le forum Développement
    Réponses: 4
    Dernier message: 04/02/2009, 00h14
  5. Réponses: 3
    Dernier message: 29/12/2008, 16h31

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