__fonctions inline vs normale des fonctions en C
Je suis étudiant macros et a trouvé de nombreuses sources et des questions à propos de la différence entre les macros et les fonctions inline. Mais il n'y a rien qui décrivent de façon concrète, précise et différencie les pros&cons en ligne vs fonctions normales.
Mais si je veux choisir entre le fonctionnement normal et la fonction en ligne?
Je sais que l'utilisation de la fonction inline augmentation de la taille du code. Mais en tant que bien que l'étude de la taille n'est pas le principal problème , l'efficacité est l'objectif. Faire une fonction une fonction inline suggère que les appels à la fonction d'être aussi rapide que possible.(En raison de la pile et des trucs généraux)
Est toujours à l'aide de la fonction inline est mieux ou pas? Si non, alors POURQUOI? Quels sont les avantages de l'utilisation normale des fonctions inline?
Lors de la lecture d'autres questions, j'ai lu que inline n'est qu'une indication pour le compilateur. Compilateur peut l'ignorer. Quand compilateur de les ignorer et de POURQUOI?
Il n'y a pas de règle d'or. Parfois, il est mieux de l'inclure (pour enregistrer un appel de fonction pile et de manipulations), parfois c'est pas la peine (code de l'augmentation de la taille de trop). Vous ne trouverez pas de La seule Vraie Réponse, il n'existe pas.
fine, que sur les autres. Comme je l'ai utiliser une fonction récursive très moins.
Le compilateur décision de l'associé est le plus souvent fixé à l'aide d'un heuristic.
Juste comme remarque, à l'égard de ce qui doit arriver avec un
inline
marquée de la fonction qu'il ne va pas créer de liens de conflits lors de son définition se produit dans plusieurs unités de compilation. Vous pouvez le mettre dans un fichier d'en-tête. En ce sens, inline
rend possible qu'une fonction est incorporé dans plusieurs unités.OriginalL'auteur Abhishek Gupta | 2012-04-12
Vous devez vous connecter pour publier un commentaire.
Inlining une fonction peut avoir plusieurs avantages:
Qu'il peut faire la taille du programme petits. C'est généralement le cas lorsqu'une fonction n'est utilisée qu'une fois. Aussi, voir les 2. et 3.
Le compilateur peut éliminer les bits non utilisés de la fonction, si le compilateur sait qu'une variable est une constante ou une valeur non NULLE, ou quelque chose comme ça. Cela permet d'économiser sur la taille, mais aussi rend le code plus efficace au moment de l'exécution.
Le compilateur peut éliminer les bits de la fonction d'appel, ou même d'autres fonctions inline, car il peut voir ce que la fonction ne avec/pour les données. (Dire le code vérifie la valeur de retour et appelle une fonction d'erreur si c'est NULL, il pourrait être en mesure à la règle.
Il peut réduire l'appel de la surcharge, dans des processeurs actuels prédictive de branchement qui n'est pas tant de gagner que vous pourriez le penser.
Il peut lever constante peu en dehors de la boucle, faire des sous-expressions redondantes élimination, et de nombreuses autres optimisations à faire en boucle le code plus efficace, et telles.
Et puis il y a les inconvénients:
Il peut rendre le code plus, évidemment.
Il peut augmenter registre de la pression à l'intérieur de la fonction appelante qui pourraient confondre le compilateur et l'empêcher d'optimisation.
Avoir un hot fonction de ce que peut vivre dans le cache du PROCESSEUR peut être plus rapide que de dupliquer il à beaucoup de lieux qui ne sont pas toujours mis en cache.
Il peut nuire à débogage.
La raison que la fonction en ligne est juste un conseil c'est surtout parce que la norme n'exige pas que le compilateur d'optimiser quoi que ce soit. Si ce n'était pas un soupçon alors l'optimisation ne serait pas en option. Aussi, juste parce que la fonction n'est pas marqué inline n'arrête pas le compilateur inline-il si on calcule que cela serait avantageux.
inline
soupçon, et il suffit d'utiliser l'optimisation des drapeaux dans le Makefile en ligne, comme le compilateur voit ajustement.OriginalL'auteur ams
Généralement le compilateur va choisir de l'inclure si elle décide que le rendement sera meilleur. Il a donc à comparer le coût de l'appel de la non-fonction en ligne (en appuyant sur les arguments sur la pile, l'enregistrement des registres, etc) est plus que le code lui-même. Donc, pour la simple accesseurs, ou des calculs simples, il est souvent le cas que le coût de l'appel d'une fonction est plus, donc le compilateur en ligne.
Souvent les compilateurs ont des contraintes de taille de trop, de sorte qu'ils ne permettent pas d'inlining de croître le code de trop.
Il y a aussi la localité pour être considéré. Une fonction inline ne sera pas susceptible de provoquer une défaillance de page, pas susceptible de causer un cache de processeur manquer, donc sera généralement plus rapide à partir de ce point de vue. Non inline fonctions auront souvent besoin de code pour être chargé dans le cache du processeur, qui est très lente en comparaison.
Il y a d'autres raisons pour déclarer les fonctions pour être en ligne, même si vous n'avez pas vraiment s'attendre à ce que le compilateur inline. L'ensemble de la STL C++ est incorporé, même s'il est probable que la plupart de il ne serait jamais capable d'être insérée. Il est fait de cette façon pour des raisons de instanciation du modèle, et les problèmes liés à l'application interfaces binaires et ainsi de suite.
Si vous voulez, puis pls des précisions sur la contrainte de taille de la partie et je pense que le commentaire de Brett est ma réponse.
Le compilateur a un ensemble d'options pour le contrôle en fonction de la taille peut être insérée. Par exemple,
--param max-inline-insns-single=<num>
contrôles d'inlining des fonctions qui sont appelées à partir d'un seul endroit. Il y a plusieurs de ce genre.OriginalL'auteur Tom Quarendon
Les avantages de l'in-lining une fonction est de retirer l'appel de la fonction de surcharge et de donner de l'optimiseur une meilleure chance d'optimiser le code d'appel avec le code de la fonction. Par exemple, l'optimiseur peut éliminer complètement le code inline dans certaines circonstances.
L'inconvénient est la possibilité d'augmenter votre taille de code qui, dans certaines circonstances, peuvent ralentir la vitesse d'exécution si le goulot d'étranglement est le CPU instruction fetch.
Donc ça dépend. Les compilateurs utilisent diverses méthodes heuristiques pour déterminer si une fonction inline est un net avantage. Un compilateur peut incorporer une fonction, même si vous n'avez pas à spécifier le mot-clé inline ou inline si vous le faites. Il y a généralement des moyens de forcer un compilateur associé à la fonction pour remplacer sa décision.
Ce Quelles sont les bonnes méthodes heuristiques pour inline fonctions? a une bonne discussion et des liens supplémentaires concernant l'in-lining heuristiques.
Réprimander les personnes qui tentent de vous aider à vous n'est pas vraiment une bonne politique.
Je ne suis pas juste répéter ce que vous avez dit. Je suis aussi en disant que le code augmentation peut entraîner une diminution de la performance, donc il y a plus d'inlining que de simplement la taille du code. Il peut augmenter ou diminuer la taille du code et il peut augmenter ou diminuer les performances.
OriginalL'auteur Guy Sirton
Lorsque vous utilisez une fonction inline, le code de la fonction est collé à la ligne lorsqu'il est appelé, il génère aussi un programme exécutable plus grand que celui qui ne veut pas utiliser les fonctions inline, dans l'autre main, un pas de fonction inline, lorsqu'elle est appelée, l'arrêt du programme et les sauts à la mémoire dir où le code de la fonction de démarrage...
Conclusion:
fonction inline = meilleure performance, plus d'espace
fonction = moins d'espace, légèrement moins performant
OriginalL'auteur DGomez
Il y a une assez bonne vue d'ensemble du ccg inline options et les processus de décision au GNU GCC.
Qui identifie le cas où inline n'est pas possible: "l'utilisation de varargs, l'utilisation de l'alloca, l'utilisation de la variable de la taille des types de données, l'utilisation de la goto, l'utilisation de non goto, et les fonctions imbriquées"
Un point important est un non-statique de la fonction, j'.e un avec
extern
de liaison (qui est de toutes les fonctions, qui est déclarée sansstatic
) peut être appelé, ou avoir une adresse prises dans un autre fichier source.Cela force le compilateur à générer un niveau "normal" de la fonction ainsi que de toute fonction inline corps. Bien entendu, cela génère un programme qui est plus grand que seulement la génération de la "normale" non-fonction inline.
Gcc a une option
-ffunction-sections
qui génèrent des fichiers objets qui permettent à l'éditeur de liens pour éliminer les fonctions qui ne sont pas utilisés, le coût de "... l'assembleur et l'éditeur de liens se créent plus d'objet et les fichiers exécutables, et sera également plus lent."Sur les versions plus récentes de gcc, de la Liaison des Optimisations (LTO) (voir "Tout Le Programme Des Optimisations") est pris en charge. Cela permet une optimisation de la scène pour regarder tous le programme compilé, et faire encore plus agressive inline et d'optimisation, et de l'exclure de code inutilisé.
Il est également intéressant de se pencher sur certains des nouveaux gcc-4.6 gcc-4.7 Interprocedural optimisations. Par exemple inline-ing seulement le "chaud" chemin d'une fonction en ligne, plutôt que de l'ensemble de la fonction. Gcc pourrait également générer plusieurs instances d'une fonction, parce que les constantes sont connus, et gcc calcule, il est préférable d'avoir plusieurs implémentations, chacune optimisée pour les constantes.
Il y a des options de gcc pour demander au compilateur de inline tous “assez simple” fonctions.
Enfin, il dit: "tel Que requis par la norme ISO C++, GCC considère les fonctions de membres définies dans le corps d'une classe à être marqué inline même si elles ne sont pas explicitement déclarées avec le mot-clé inline". Auquel cas sa règle pour "assez simple" est utilisé.
Résumé: le compilateur peut faire très intelligent optimisations au-dessus et au-delà de ce qu'on pourrait attendre de l'ordinaire des fonctions ou des fonctions inline.
Toutes les fonctions qui sont déclarées sans le mot
static
sont non-statique. Cela signifie que la fonction estextern
de liaison, et est donc visible à l'extérieur du fichier (unité de compilation) pour tout le reste du programme. Cela signifie que le compilateur générer un niveau "normal" de la fonction dans le cas où la fonction est appelée d'ailleurs, ou même que quelque chose prend son adresse (il n'a pas besoin d'être appelé). L'éditeur de liens ne peut permettre d'éliminer le générés fonction extern si la fonction n'est jamais appelée, et son adresse n'est pas pris.L'éditeur de liens ne peut éliminer les fonctions si le code a été compilé avec
-ffunction-sections
et en lien avec les--gc-sections
. Les options du compilateur-fwhole-program
et-flto
sont également en mesure d'éliminer inutilisés extern fonctions (pour ne pas mentionner les fonctions inline d'autres C de fichiers).oui, vaut la peine d'ajouter. Merci.
OriginalL'auteur gbulmer