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
![]()
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
![]()
Bonjour,
En gros c'est une macro en plus sécurisée : Les fonctions en ligne.
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:
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...
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(); }
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
Bonjour,
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).Envoyé par koala01
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.
Envoyé par thewho
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 ?
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 .
merci les amis ( surtout KOALA 01), grâce à vous j'ai compris un peu l'interet de cette fonctionmais 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
![]()
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...Envoyé par Clad3
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
Gege2061 à posté le lien de la FAQ c'est assez explicite.Envoyé par gege2061
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.
Merci Merci beaucoups , maintenant je serai sûr de ce que je ferai (inchallah) graçe à vous bien evidement, merci encore et a+![]()
Bonjour,
Je n'ai pas d'exemple en tête, mais le bouquinEnvoyé par vinny_the_true
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...Envoyé par thewho
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.
-Winline pour GCC, pas si difficile que ça a trouver...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...
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.
'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.
ICC les supporte aussi, dans une des 2 formes selon le compilo qu'il émule.
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))
Note: échouer n'est pas une option![]()
J'avais essayé, mais ça ne marche absolument pas. Cette option est une arnaque...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2#define FINLINE __attribute__((always_inline))
J'avais essayé avec ICC sous Linux, ça marchait pas non plus (ni __forceinline, ni __attribute)ICC les supporte aussi, dans une des 2 formes selon le compilo qu'il émule.
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.
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.
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.Envoyé par Charlemagne
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.Envoyé par Charlemagne
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.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.
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.
'inline' est une indication facultative, l'attribut 'always_inline' est imperatif; en cas d'impossibilité, gcc lève une erreur.Envoyé par Charlemagne
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.
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.Envoyé par Charlemagne
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![]()
Partager