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++

  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 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    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 confirmé
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Par défaut arigatoo
    merci les amis ( surtout KOALA 01), grâce à vous j'ai compris un peu l'interet de cette fonction mais si vous permettez ( ça sera trés gentil ) de me donner encore plus d'information par ce que c'est pas encore 100% visible ( vù que j'ai quelques ptites difficultées dans la langues française) merci encore

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Clad3
    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 .
    A titre personnel, je n'inline moi-même que les accesseurs sur les membres privés et autres fonctions qui ne font vraiment qu'une ou deux instructions...

    Quoi qu'il en soit, je n'inline jamais une fonction qui contient un (ou plusieurs) boucles, et je laisse le soin au compilo de décider pour les autres comment il les gère
    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

  9. #9
    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 : 45
    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.

  10. #10
    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+

  11. #11
    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).

  12. #12
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par thewho
    Bonjour,

    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).
    Tiens justement, ya pas un moyen de savoir si le compilateur nous a refusé un inline ? J'ai jamais trouvé dans Visual C++ ni GCC...

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Sous Visual, tu peux activer un warning pour cela.
    Cherche à "warnings that are off by default"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Tiens justement, ya pas un moyen de savoir si le compilateur nous a refusé un inline ? J'ai jamais trouvé dans Visual C++ ni GCC...
    -Winline pour GCC, pas si difficile que ça a trouver...

    Par contre si quelqu'un connaissait le moyen de forcer les inlines, en particulier sur GCC, je suis vraiment vraiment intéressé.
    Il y a bien '__forceinline' sous VC, mais je l'impression que ça marche pas à tous les coups. C'est quand-même déjà ça.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut
    'inline' est au mieux une indication, qui plus est généralement redondante; ces extensions sont beaucoup plus utiles surtout dans le contexte de l'optimisation globale - par exemple au moment du linkage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // MSVC
    #define FINLINE		__forceinline
    #define NOINLINE	__declspec(noinline)
    // GCC
    #define FINLINE		__attribute__((always_inline))
    #define NOINLINE	__attribute__((noinline))
    ICC les supporte aussi, dans une des 2 formes selon le compilo qu'il émule.
    Note: échouer n'est pas une option

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define FINLINE		__attribute__((always_inline))
    J'avais essayé, mais ça ne marche absolument pas. Cette option est une arnaque...

    ICC les supporte aussi, dans une des 2 formes selon le compilo qu'il émule.
    J'avais essayé avec ICC sous Linux, ça marchait pas non plus (ni __forceinline, ni __attribute)
    J'utilise principalement ICL (ICC sous windows), __forceinline marche en général pas trop mal, mais j'ai vu des différences notables d'une version à l'autre. Je me suis callé sur une version un peu ancienne de ICL, mais qui marche nickel.

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Sous Visual, il me semble que le warning indique généralement pourquoi une fonction n'a pas pu être inlinée...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut
    Citation Envoyé par Charlemagne
    J'avais essayé, mais ça ne marche absolument pas. Cette option est une arnaque...
    Je regrette, mais cela fonctionne de façon fiable depuis des lustres; encore faut-il noter que cela doit faire partie de la déclaration de la fonction.

    Citation Envoyé par Charlemagne
    J'avais essayé avec ICC sous Linux, ça marchait pas non plus (ni __forceinline, ni __attribute)
    J'utilise principalement ICL (ICC sous windows), __forceinline marche en général pas trop mal, mais j'ai vu des différences notables d'une version à l'autre. Je me suis callé sur une version un peu ancienne de ICL, mais qui marche nickel.
    Encore une fois je regrette, mais que celà soit avec la version 8 ou 9 d'ICC, sous Linux ou windows, avec force/noinline, j'ai tjs obtenu un résultat déterministe.
    Mais la aussi, cela doit apparaitre dans la déclaration.

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Encore une fois je regrette, mais que celà soit avec la version 8 ou 9 d'ICC, sous Linux ou windows, avec force/noinline, j'ai tjs obtenu un résultat déterministe.
    Mais la aussi, cela doit apparaitre dans la déclaration.
    Sur mon projet en tout cas ça ne marche pas. Mais peut-être bien que les fonctions que je désire inliner sont trop nombreuses ou trop volumineuses au goût de GCC et de ICC. L'option 'Winline' de GCC me confirmait bien qu'il n'en faisait qu'à sa tête en refusant obstinément d'inliner tout un tas de fonctions.

    La vitesse d'exécution s'en trouve sérieusement ralentie par rapport à ICL sur des fonctions critiques (environ 2x plus lent).

    Ca me surprend de la part d'ICC, parce que ICL réagit bien aux inlines forcés, pourtant je croyais que ICC était sous Linux le pendant d'ICL.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut
    Citation Envoyé par Charlemagne
    Sur mon projet en tout cas ça ne marche pas. Mais peut-être bien que les fonctions que je désire inliner sont trop nombreuses ou trop volumineuses au goût de GCC et de ICC. L'option 'Winline' de GCC me confirmait bien qu'il n'en faisait qu'à sa tête en refusant obstinément d'inliner tout un tas de fonctions.
    'inline' est une indication facultative, l'attribut 'always_inline' est imperatif; en cas d'impossibilité, gcc lève une erreur.
    Si ce n'est pas le cas, c'est par définition un bug.
    Le dernier que j'ai rapporté sur le sujet étant http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26667 mais c'était une subtilité.
    Si vous avez de quoi substancier vos propos, il serait de bon ton de soumettre un rapport de bug.

    Citation Envoyé par Charlemagne
    La vitesse d'exécution s'en trouve sérieusement ralentie par rapport à ICL sur des fonctions critiques (environ 2x plus lent).
    ICC peut pratiquer une optimisation globale au link-time, ce que gcc ne peut faire pour l'instant; cela a une incidence particuliere sur l'inlining, les statiques et les conventions d'appel etc... Qui plus est ICC est par défaut beaucoup plus aggressif.
    Il y a des moyen de contourner cette limitation, notament avec -combine (pour l'instant incompatible avec le C++), la réduction de la visibilité par défaut et autre siouxerie, mais cela reste délicat.
    En géneral j'obtiens plus facilement du code de qualité de GCC que d'ICC... pour ce que ça vaut

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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