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 :

Fonction Inline ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Par défaut Fonction Inline ?
    ohayoo minna, j'aimerai bien savoir le rôle de la fonction Inline, j'ai jeté un coup d'oeil sur un cour de " Christian Casteyde " sur C++ mais je craint que j'ai pas bien compris , donc je vous pris de m'aider. merci d'avance

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    En gros c'est une macro en plus sécurisée : Les fonctions en ligne.

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

    Informations professionnelles :
    Activité : aucun

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

    Pour simplifier, on pourrait dire que, quand tu appelle une fonction dans un programme, les instructions créées pour le compilateur font qu'une série d'informations est mise (de tete, la valeur du pointeur courent, et les valeurs des différents différents accus...Mais peut etre encore d'autres?) en "stack" (pille) au sein du processeur.

    La pille, c'est un peu de mémoire qui est destiné à permettre au processeur de reprendre l'exécution d'un programme là ou il l'avait laissé avant d'entrer dans une sous routine.

    L'astuce c'est que la sauvegarde et la récupération de ces informations, ca prend du temps, et qu'en plus, la pille n'est pas infini (les erreur "stack overflow" arrivent quand on essaye de mettre des valeurs en pille, mais que la capacité maximale de celle-ci est atteinte)

    L'idée d'une fonction inline, c'est de dire que "je sais que j'ai créé une fonction, mais je voudrais que les instructions qu'elle contient soient intégrée directement dans ma routine, plutot que de faire jouer le phénomene d'appel des routines du processeur"

    L'exemple classique que l'on pourrait donner est celui d'un accesseur dans une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class maclasse
    {
        private:
    //un membre prive
           int monnombre;
        public:
    //l'accesseur pour le membre
           int GetMonNombre();
    }
    Faire jouer l'appel d'une routine pour quelque chose qui, en définitive, ne demande qu'à récupérer la valeur d'un entier, c'est un peu lourd...

    C'est la raison pour laquelle, on préférera souvent déclarer la fonction inline, ce qui indiquera au préprocesseur que "partout ou tu tombera sur GetMonNombre(), ben, tu le remplacera par les instruction que la fonction comporte"

    Mais c'est une lame à double tranchant: Tu gagne en rapidité d'exécution et en économie de la pille ce que tu perd en taille de l'exécutable fini (si tu as une fonction inline plus importante que celle prise dans mon exemple, et que tu l'appelle 100 fois, ses instructions seront recopiée 100 fois dans l'exécutable, alors que, s'il s'était agit d'une fonction normale, on ne les aurait eu qu'une seule fois dans l'exécutable fini)
    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
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par koala01
    Mais c'est une lame à double tranchant: Tu gagne en rapidité d'exécution et en économie de la pille ce que tu perd en taille de l'exécutable fini (si tu as une fonction inline plus importante que celle prise dans mon exemple, et que tu l'appelle 100 fois, ses instructions seront recopiée 100 fois dans l'exécutable, alors que, s'il s'était agit d'une fonction normale, on ne les aurait eu qu'une seule fois dans l'exécutable fini)
    C'est même bien pire que cela : comme il est à la discrétion du compilateur d'effectivement mettre, ou non, la fonction inline, il peut parfaitement la mettre inline dans une partie du code, et comme une fonction ordinaire dans une autre partie (c'est parfaitement légal pour la norme).
    Il y a des cas où ce comportement "indéfini" posera problème.

    Donc, bien savoir ce que l'on fait avec la directive inline.

  5. #5
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Par défaut
    Citation Envoyé par thewho
    Il y a des cas où ce comportement "indéfini" posera problème.

    Donc, bien savoir ce que l'on fait avec la directive inline.

    Ne t'arrête pas en si bon chemin, tu m'intéresses là ! Il existe des cas où le comportement du code peut être changé par le fiat d'inliner ou non une fonction ??

    Tu pourrais développer par un exemple ?

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Apres quelques recherche j'en suis arrivé a la conclusion qu'il fallait laisser le navigateur inliner comme bon lui semblait, dans 90% des cas c'est préférable .

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par vinny_the_true
    Ne t'arrête pas en si bon chemin, tu m'intéresses là ! Il existe des cas où le comportement du code peut être changé par le fiat d'inliner ou non une fonction ??

    Tu pourrais développer par un exemple ?
    Je n'ai pas d'exemple en tête, mais le bouquin
    Scott Meyers - "Effective C++"
    le montre bien, avec certes des exemples plus ou moins tordus, et montre quelques dangers/problèmes dus au fait de laisser le compilateur décider s'il met inline ou non.

    Un des problèmes dont je me souviens assez bien est:

    - Les fonctions "inline" sont normalement définies dans un fichier .h.

    - Si le compilateur décide de ne pas la mettre "inline", il lui faut éviter le problème de "multi-définition" lors du link (car alors la fonction serait définie dans chaque module incluant le .h en question), pour cela, il déclare automatiquement la fonction static dans ce fichier.

    - On a alors a une définition locale de la fonction pour chaque fichier ayant inclu le .h

    - On perd donc le principal avantage du "inline" : on fait des appels de fonction ordinaires

    - ET on perd l'avantage de garder une fonction ordinaire, qui est le gain de place : la fonction existe alors en plusieurs exemplaires (qui peuvent être relativement nombreux pour les gros projets).

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,

    En gros c'est une macro en plus sécurisée : Les fonctions en ligne.
    Gege2061 à posté le lien de la FAQ c'est assez explicite.

    C'est pour informer le compilateur que tu aimerais qu'il puisse mettre en ligne la fonction, c'est une optimisation, mais le compilateur, peut ou non prendre en compte l'information. Tu peux inliner une fonction A, et ne pas inliner une fonction B, mais le compilateur peut très bien ne pas inliner la fonction A et inliner la fonction B.

    C'est de moins en moins utilisé, car les machines sont puissantes, marquer inline partout est inutile, le compilateur sera surement mieux le faire que toi.
    A moins que tu souhaites pour X raison demander d'inliner une fonction spécifique, en pensant que peut être cela pourrait aller plus vite.

    ps: Cela ne change en rien ton code, juste les performances.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Par défaut
    Merci Merci beaucoups , maintenant je serai sûr de ce que je ferai (inchallah) graçe à vous bien evidement, merci encore et a+

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

Discussions similaires

  1. Fonctions inline imbriquées
    Par pelotudo dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/03/2007, 21h16
  2. Instanciation dans une fonction inline
    Par mister3957 dans le forum C++
    Réponses: 5
    Dernier message: 04/03/2007, 19h27
  3. Réponses: 7
    Dernier message: 12/11/2006, 12h49
  4. Fonctions inline
    Par vdumont dans le forum C++
    Réponses: 5
    Dernier message: 12/05/2006, 19h40
  5. Fonctions inlines et fichiers .lib
    Par michhh dans le forum C++
    Réponses: 3
    Dernier message: 05/07/2005, 03h09

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