Les avantages de fonctions inline en C++?
Qu'est-ce que les avantages et les inconvénients de l'utilisation de fonctions inline en C++? Je vois qu'il n'augmente les performances pour le code que le compilateur de sorties, mais aujourd'hui, optimisé compilateurs, rapide Cpu, de mémoire énorme etc. (pas comme dans les années 1980< où la mémoire se faisait rare et il fallait que tout ajustement de 100 ko de mémoire) quels avantages ont-ils vraiment aujourd'hui?
- C'est l'une de ces questions où la connaissance commune est faux. Tout le monde a répondu à la norme Comp Sci réponse. (Inlining enregistre la fonction de coût d'un appel, mais augmente la taille du code). De la foutaise. Il fournit un mécanisme simple pour le compilateur d'appliquer plus d'OPTIMISATIONS.
- C'est l'une de ces réponses se présentant comme des commentaires. Si vous n'aimez pas les réponses qui ont été posté, poster votre propre réponse et de voir comment il va.
- La base de cette question est viciée. C++ fonctions inline ont peu à voir avec les compilateurs inline lors de la compilation. Il est regrettable que
inline
est un c++ mot-clé et que l'in-lining est une technique d'optimisation du compilateur. Voir la question "quand devrais-je écrire le mot-cléinline
pour une fonction/méthode" pour la réponse correcte. - Votre lien a obtenu de déformation - le lien actuel est exforsys.com/tutorials/c-plus-plus/inline-functions.html
Vous devez vous connecter pour publier un commentaire.
Fonctions Inline sont plus rapides parce que vous n'avez pas besoin de push et pop de choses sur/en dehors de la pile comme les paramètres et l'adresse de retour; cependant, elle permet de faire de votre binaire légèrement plus grand.
T-il une différence significative? Pas de manière assez remarquable sur le matériel moderne pour la plupart. Mais il peut faire une différence, ce qui est suffisant pour certaines personnes.
Marquant quelque chose inline ne vous donne pas une garantie qu'il sera en ligne. C'est juste une suggestion pour le compilateur. Parfois, il n'est pas possible (par exemple, lorsque vous avez une fonction virtuelle, ou quand il y a récursivité impliqués. Et parfois, le compilateur juste choisit de ne pas l'utiliser.
J'ai pu voir ce genre de situation, faire une différence détectable:
Avantages
Inconvénients
Inline Magie
return 42 ;
déclaration. C'est pour moi, l'extrême inline. Il arrive rarement dans la vraie vie, il est temps de compilation plus, permettra de ne pas encombrer votre code, et permet de rendre votre code plus rapide. Mais comme le graal, n'essayez pas de l'appliquer partout, parce que la plupart de traitement ne peut pas être résolu de cette façon... Encore, c'est cool de toute façon...:-p
3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template
. Au 5.1.5/6For a generic lambda, the closure type has a public inline function call operator member template
. Et à7.1.2/2: the use of inline keyword is to declare an inline function
où c'est une suggestion pour insérer le corps de la fonction au point d'appel. Donc, j'en conclus que, même si elles peuvent se comporter de la même, les fonctions inline et les modèles de fonction sont toujours séparés, notions orthogonales qui peuvent être mixtes (c'est à dire de la fonction inline modèle)Dans archaïque C et C++,
inline
est commeregister
: une suggestion (rien de plus qu'une suggestion) pour le compilateur sur une optimisation possible.En C++ moderne,
inline
indique à l'éditeur de liens qui, si plusieurs définitions (pas de déclarations) se retrouvent dans les différentes unités de traduction, ils sont tous les mêmes, et l'éditeur de liens peut librement garder et jeter tous les autres.inline
est obligatoire si une fonction (peu importe la complexité ou "linéaire") est définie dans un fichier d'en-tête, pour permettre à de multiples sources afin de l'inclure sans l'obtention d'une "définition de plusieurs" erreur de l'éditeur de liens.Membre des fonctions définies à l'intérieur d'une classe sont "en ligne" par défaut, comme modèle de fonctions (par opposition à des fonctions globales).
Note l'inclusion de fichiera.h en deux .fichiers cpp, résultant dans les deux cas de
afunc()
.L'éditeur de liens se jeter l'un d'eux.
Si aucun
inline
est spécifié, l'éditeur de liens se plaindre.Inline est une suggestion pour le compilateur, ce qui, il est libre de les ignorer. Il est idéal pour les petits bouts de code.
Si votre fonction est incorporé, il est inséré dans le code où l'appel de la fonction est faite pour elle, plutôt que l'appel d'une fonction distincte. Cela peut aider avec la vitesse que vous n'avez pas à faire l'appel.
Il assiste également les Processeurs avec le pipelining comme ils n'ont pas à recharger le pipeline avec de nouvelles instructions causée par un appel.
Le seul inconvénient est possible augmentation de la taille du binaire, mais, tant que les fonctions sont de petite taille, ce ne sera pas de trop.
J'ai tendance à laisser ces sortes de décisions pour les compilateurs aujourd'hui (eh bien, les plus intelligents de toute façon). Les personnes qui les écrivent ont tendance à avoir une connaissance beaucoup plus fine des architectures sous-jacentes.
Fonction en ligne est la technique d'optimisation utilisée par les compilateurs. On peut simplement ajouter mot-clé inline de prototype de fonction pour faire une fonction inline. Fonction Inline instruire compilateur insérer la totalité du corps de la fonction à chaque fois que la fonction a utilisé dans le code.
Avantages :-
Il ne nécessite pas d'appel de fonction frais généraux.
Elle aussi d'économiser les frais généraux de variables push/pop sur la pile, tandis que la fonction d'appel.
Elle aussi d'économiser les frais généraux d'un retour d'appel à partir d'une fonction.
Il augmente la localité de référence en utilisant le cache d'instructions.
Après l'in-lining compilateur peut également s'appliquer intra-procédure d'optimisation si spécifié. C'est le plus important, de cette façon, le compilateur peut maintenant se concentrer sur l'élimination du code mort, peut donner plus de stress sur la direction de la prévision, variable d'induction élimination etc..
Pour vérifier plus à ce sujet, on peut suivre ce lien
http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
Je tiens à ajouter que les fonctions inline sont cruciale lorsque vous êtes à la construction de la bibliothèque partagée. Sans fonction de marquage en ligne, il sera exporté dans la bibliothèque de la forme binaire. Il sera également présent dans la table des symboles, si exporté. De l'autre côté, inline fonctions ne sont pas exportés, ni à la bibliothèque de fichiers binaires, ni à la table des symboles.
Il peut être critique lorsque la bibliothèque est destiné à être chargé lors de l'exécution. Il peut également frapper compatible au niveau binaire-courant des bibliothèques. Dans de tels cas, n'utilisez pas la ligne.
inline
lors de la construction d'une bibliothèque partagée!Lors de l'optimisation, de nombreux compilateurs fonctions inline, même si vous n'avez pas les marquer. En général seulement besoin d'indiquer des fonctions en ligne si vous savez quelque chose que le compilateur ne fonctionne pas, généralement, il peut prendre la bonne décision elle-même.
inline
permet de mettre en place une définition de fonction dans un fichier d'en-tête et#include
que les fichiers d'en-tête de plusieurs fichiers source, sans violer l'une définition de la règle.Généralement parlant, ces jours-ci avec n'importe quel compilateur moderne se soucier de l'in-lining, tout est presque une perte de temps. Le compilateur doit réellement d'optimiser l'ensemble de ces considérations pour vous par le biais de sa propre analyse du code et de votre cahier des charges en vue de l'optimisation des drapeaux passés au compilateur. Si vous vous souciez de la vitesse, de dire au compilateur d'optimiser la vitesse. Si vous vous souciez de l'espace, indiquer au compilateur d'optimiser l'espace. Comme une autre réponse fait allusion, le compilateur va même inline automatiquement si il fait vraiment sens.
Aussi, comme d'autres l'ont déclaré, en ligne ne garantit pas inline de quoi que ce soit. Si vous voulez être certain, il vous faudra définir une macro au lieu d'une fonction en ligne pour le faire.
Quand en ligne et/ou de définir une macro pour forcer l'inclusion? - Seulement quand vous avez démontré et nécessaire prouvé l'augmentation de la vitesse pour une critique de la section de code qui est connu pour avoir un effet sur la performance globale de l'application.
Il n'est pas tout sur la performance. Les deux C++ et C sont utilisés pour la programmation embarquée, assis sur le dessus de matériel. Si vous voulez, par exemple, écrire un gestionnaire d'interruption, vous devez vous assurer que le code peut être exécuté à la fois, sans que d'autres registres et/ou de pages de mémoire étant d'être échangé. C'est lorsqu'ils sont incorporés est très pratique. Bon compilateurs faire un peu de "inline" eux-mêmes quand la vitesse est nécessaire, mais "inline" oblige.
Est tombé dans le même problème avec inline fonctions dans les bibliothèques. Il semble que inline fonctions ne sont pas compilées dans la bibliothèque. en conséquence, l'éditeur de liens met un "undefined reference" erreur, si un exécutable qui veut utiliser la fonction inline de la bibliothèque. (m'est arrivé la compilation de Qt source avec gcc 4.5.
Pourquoi ne pas faire toutes les fonctions inline par défaut? Parce que c'est un génie hors commerce. Il y a au moins deux types de "l'optimisation": l'accélération du programme et de réduire la taille (de mémoire) du programme. Inline généralement accélère les choses. Il se débarrasse de l'appel de fonction, les frais généraux, en évitant les poussant puis en tirant paramètres de la pile. Cependant, il fait aussi de l'empreinte mémoire du programme de plus grandes, parce que chaque appel de fonction doit maintenant être remplacé par le code complet de la fonction. Pour rendre les choses encore plus compliquées, n'oubliez pas que le PROCESSEUR stocke fréquemment utilisé des morceaux de la mémoire cache sur le PROCESSEUR ultra-rapide d'accès. Si vous faites le programme de la mémoire d'image assez grand, votre programme ne sera pas en mesure d'utiliser le cache de manière efficace, et dans le pire des cas inline pourraient effectivement ralentir votre programme vers le bas. Dans une certaine mesure, le compilateur peut calculer ce que les compromis sont, et peuvent être en mesure de prendre de meilleures décisions que vous pouvez, simplement en regardant le code source.
Notre professeur d'informatique nous a exhortés à ne jamais utiliser inline dans un programme c++. Quand on lui demande pourquoi, il nous a gentiment expliqué à utiliser que les compilateurs modernes doivent permettre de détecter quand utiliser inline automatiquement.
Donc oui, la ligne peut être une technique d'optimisation pour être utilisés dans la mesure du possible, mais apparemment, c'est quelque chose qui est déjà fait pour vous chaque fois que c'est possible d'incorporer une fonction, de toute façon.
inline
en C++ a deux significations distinctes — une seule de celles-ci est liée à l'optimisation et de votre professeur est correct en ce qui concerne cela. Cependant, le deuxième sens deinline
est souvent nécessaire pour satisfaire les Une Définition de la Règle.Conclusion de une autre discussion ici:
, Y a des inconvénients avec des fonctions inline?
Apparemment, Il n'y a rien de mal à utiliser les fonctions inline.
Mais il est intéressant de noter les points suivants!
La surutilisation de l'in-lining peut effectivement rendre les programmes plus lent. Selon une fonction de la taille), d'inlining il peut causer de la taille du code d'augmenter ou de diminuer. Inline un très petit accesseur de la fonction sera généralement une réduction de la taille du code, tandis que l'in-lining, une très grande fonction peut augmenter considérablement la taille du code. Sur les processeurs modernes plus petit code s'exécute plus rapidement grâce à une meilleure utilisation du cache d'instructions. - Les Directives De Google
Les avantages de rapidité de fonctions en ligne ont tendance à diminuer à mesure que la fonction prend de l'ampleur. À un certain point, la surcharge de l'appel de la fonction devient faible par rapport à l'exécution de la fonction du corps, et l'avantage est perdu - Source
Il y a peu de situations où une fonction en ligne peut ne pas fonctionner:
La
__inline
mot-clé provoque une fonction inline uniquement si vous spécifiez l'option optimiser. Si optimiser est spécifié, si oui ou non__inline
est à l'honneur dépend du paramétrage de la ligne de l'optimiseur option. Par défaut, la ligne de l'option est en effet à chaque fois que l'optimiseur de requête est exécutée. Si vous spécifiez l'optimiser , vous devez également spécifier le noinline option si vous souhaitez que le__inline
mot-clé pour être ignoré. -Sourceinline
mot-clé pour déterminer si ou de ne pas inline code tous les points ci-dessus sont fausses. Ils serait vrai si le compilateur utilisé le mot clé inline (elle est seulement utilisée pour la détermination de marquage de multiples définitions pour les liens fins).