Quels sont les avantages / inconvénients de l'utilisation des fonctions en ligne en C ++? Je vois que cela n'augmente que les performances du code généré par le compilateur, mais avec les compilateurs optimisés d'aujourd'hui, les processeurs rapides, la mémoire énorme, etc. (pas comme dans les années 1980 <où la mémoire était rare et tout devait tenir dans 100 Ko de mémoire) ont-ils vraiment des avantages aujourd'hui?
c++
inline-functions
Lennie De Villiers
la source
la source
inline
s'agisse d'un mot clé c ++ et que l'incrustation soit une technique d'optimisation du compilateur. Voir cette question " quand dois-je écrire le mot-cléinline
pour une fonction / méthode " pour la bonne réponse.Réponses:
Les fonctions en ligne sont plus rapides car vous n'avez pas besoin de pousser et de faire sauter des choses sur / hors de la pile comme les paramètres et l'adresse de retour; cependant, cela rend votre binaire légèrement plus grand.
Cela fait-il une différence significative? Pas assez sur le matériel moderne pour la plupart. Mais cela peut faire une différence, ce qui est suffisant pour certaines personnes.
Marquer quelque chose en ligne ne vous donne pas la garantie qu'il sera en ligne. C'est juste une suggestion pour le compilateur. Parfois, ce n'est pas possible, par exemple lorsque vous avez une fonction virtuelle ou lorsqu'il y a récursivité. Et parfois, le compilateur choisit simplement de ne pas l'utiliser.
Je pouvais voir une situation comme celle-ci faire une différence détectable:
la source
Les avantages
Désavantages
Inlining Magic
return 42 ;
déclaration. C'est pour moi une inline extrême . Cela se produit rarement dans la vie réelle, cela allonge le temps de compilation, ne gonflera pas votre code et accélérera votre code. Mais comme le Graal, n'essayez pas de l'appliquer partout car la plupart des traitements ne peuvent pas être résolus de cette façon ... Pourtant, c'est cool quand même ...:-p
la source
3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template
. À 5.1.5 / 6For a generic lambda, the closure type has a public inline function call operator member template
. Et à l'7.1.2/2: the use of inline keyword is to declare an inline function
endroit où il est suggéré d'insérer le corps de la fonction au point d'appel. Donc, je conclus que même si elles peuvent se comporter de la même manière, les fonctions en ligne et les modèles de fonction sont toujours des notions orthogonales distinctes qui peuvent être mélangées (par exemple, modèle de fonction en ligne)En archaïque C et C ++,
inline
c'est commeregister
: une suggestion (rien de plus qu'une suggestion) au compilateur sur une éventuelle optimisation.En C ++ moderne,
inline
indique à l'éditeur de liens que, si plusieurs définitions (et non des déclarations) sont trouvées dans différentes unités de traduction, elles sont toutes identiques, et l'éditeur de liens peut librement en conserver une et éliminer toutes les autres.inline
est obligatoire si une fonction (aussi complexe ou "linéaire") soit définie dans un fichier d'en-tête, pour permettre à plusieurs sources de l'inclure sans obtenir une erreur de "définition multiple" par l'éditeur de liens.Les fonctions membres définies dans une classe sont "en ligne" par défaut, tout comme les fonctions de modèle (contrairement aux fonctions globales).
Notez l'inclusion de fileA.h dans deux fichiers .cpp, résultant en deux instances de
afunc()
. L'éditeur de liens supprimera l'un d'eux. Si noninline
est spécifié, l'éditeur de liens se plaindra.la source
Inlining est une suggestion au compilateur qu'il est libre d'ignorer. Il est idéal pour les petits morceaux de code.
Si votre fonction est en ligne, elle est essentiellement insérée dans le code où l'appel de fonction lui est fait, plutôt que d'appeler réellement une fonction distincte. Cela peut vous aider avec la vitesse car vous n'avez pas à faire l'appel réel.
Il assiste également les processeurs avec le pipelining car ils n'ont pas à recharger le pipeline avec de nouvelles instructions provoquées par un appel.
Le seul inconvénient est l'augmentation possible de la taille binaire mais, tant que les fonctions sont petites, cela n'aura pas trop d'importance.
J'ai tendance à laisser ce genre de décisions aux compilateurs de nos jours (enfin, les plus intelligents de toute façon). Les personnes qui les ont écrites ont généralement une connaissance beaucoup plus détaillée des architectures sous-jacentes.
la source
La fonction en ligne est la technique d'optimisation utilisée par les compilateurs. On peut simplement ajouter un mot clé en ligne au prototype de fonction pour créer une fonction en ligne. La fonction inline demande au compilateur d'insérer le corps complet de la fonction partout où cette fonction a été utilisée dans le code.
Avantages: -
Il ne nécessite pas de fonction appelant la surcharge.
Il enregistre également les frais généraux des variables push / pop sur la pile, lors de l'appel de fonction.
Il enregistre également les frais généraux de l'appel de retour d'une fonction.
Il augmente la localité de référence en utilisant le cache d'instructions.
Après compilation en ligne, le compilateur peut également appliquer une optimisation intra-procédurale si spécifié. C'est le plus important, de cette façon le compilateur peut désormais se concentrer sur l'élimination du code mort, peut mettre plus de stress sur la prédiction de branche, l'élimination des variables d'induction, etc.
Pour en savoir plus, on peut suivre ce lien http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
la source
Je voudrais ajouter que les fonctions en ligne sont cruciales lorsque vous créez une bibliothèque partagée. Sans marquer la fonction en ligne, elle sera exportée dans la bibliothèque sous forme binaire. Il sera également présent dans le tableau des symboles, s'il est exporté. De l'autre côté, les fonctions intégrées ne sont pas exportées, ni vers les binaires de la bibliothèque ni vers la table des symboles.
Cela peut être critique lorsque la bibliothèque est destinée à être chargée au moment de l'exécution. Il peut également toucher des bibliothèques compatibles avec les binaires. Dans de tels cas, n'utilisez pas inline.
la source
inline
lors de la construction d'une bibliothèque partagée!Pendant l'optimisation, de nombreux compilateurs intègrent des fonctions même si vous ne les avez pas marquées. Vous n'avez généralement besoin de marquer les fonctions comme étant en ligne que si vous savez quelque chose que le compilateur ne sait pas, car il peut généralement prendre la bonne décision lui-même.
la source
inline
vous permet de placer une définition de fonction dans un fichier d'en-tête et#include
ce fichier d'en-tête dans plusieurs fichiers source sans violer la règle d'une définition.la source
De manière générale, ces jours-ci, tout compilateur moderne se souciant d'inclure quoi que ce soit est à peu près une perte de temps. Le compilateur doit en fait optimiser toutes ces considérations pour vous grâce à sa propre analyse du code et à votre spécification des indicateurs d'optimisation passés au compilateur. Si vous vous souciez de la vitesse, dites au compilateur d'optimiser la vitesse. Si vous vous souciez de l'espace, dites au compilateur d'optimiser l'espace. Comme une autre réponse a fait allusion, un compilateur décent s'alignera même automatiquement si cela a vraiment du sens.
De plus, comme d'autres l'ont dit, l'utilisation de l'inline ne garantit rien de l'inline. Si vous voulez le garantir, vous devrez définir une macro au lieu d'une fonction inline pour le faire.
Quand aligner et / ou définir une macro pour forcer l'inclusion? - Seulement lorsque vous avez une augmentation de vitesse démontrée et nécessaire pour une section critique de code qui est connue pour avoir un effet sur les performances globales de l'application.
la source
Ce n'est pas qu'une question de performance. C ++ et C sont tous deux utilisés pour la programmation intégrée, assis sur le matériel. Si vous voulez, par exemple, écrire un gestionnaire d'interruption, vous devez vous assurer que le code peut être exécuté en une seule fois, sans que des registres et / ou des pages mémoire supplémentaires ne soient échangés. C'est à ce moment-là que l'inline est utile. Les bons compilateurs font eux-mêmes un "alignement" lorsque la vitesse est nécessaire, mais "en ligne" les oblige.
la source
Tombé dans le même problème avec les fonctions en ligne dans les bibliothèques so. Il semble que les fonctions intégrées ne soient pas compilées dans la bibliothèque. en conséquence, l'éditeur de liens émet une erreur de "référence non définie", si un exécutable souhaite utiliser la fonction intégrée de la bibliothèque. (m'est arrivé de compiler la source Qt avec gcc 4.5.
la source
Pourquoi ne pas rendre toutes les fonctions en ligne par défaut? Parce que c'est un compromis d'ingénierie. Il existe au moins deux types d '"optimisation": accélérer le programme et réduire la taille (empreinte mémoire) du programme. L'intégration accélère généralement les choses. Il supprime la surcharge de l'appel de fonction, évitant de pousser puis d'extraire des paramètres de la pile. Cependant, cela augmente également l'empreinte mémoire du programme, car 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 CPU stocke des morceaux de mémoire fréquemment utilisés dans un cache sur le CPU pour un accès ultra-rapide. Si vous agrandissez suffisamment l'image mémoire du programme, votre programme ne pourra pas utiliser efficacement le cache et, dans le pire des cas, l'inlining pourrait en fait ralentir votre programme.
la source
Notre professeur d'informatique nous a exhortés à ne jamais utiliser inline dans un programme c ++. Lorsqu'on lui a demandé pourquoi, il nous a gentiment expliqué que les compilateurs modernes devraient détecter quand utiliser en ligne automatiquement.
Donc oui, l'inline peut être une technique d'optimisation à utiliser dans la mesure du possible, mais apparemment, c'est quelque chose qui est déjà fait pour vous chaque fois qu'il est possible d'inline une fonction de toute façon.
la source
inline
en C ++ a deux significations très distinctes - une seule d'entre elles est liée à l'optimisation, et votre professeur a raison à cet égard. Cependant, le deuxième sens deinline
est souvent nécessaire pour satisfaire la règle de définition unique .Conclusion d' une autre discussion ici:
Y a-t-il des inconvénients avec les fonctions en ligne?
Apparemment, il n'y a rien de mal à utiliser les fonctions en ligne.
Mais il convient de noter les points suivants!
La surutilisation de l'inline peut en fait ralentir les programmes. Selon la taille d'une fonction, le fait de l'intégrer peut entraîner une augmentation ou une diminution de la taille du code. L'intégration d'une très petite fonction d'accesseur diminue généralement la taille du code, tandis que l'inclusion d'une très grande fonction peut augmenter considérablement la taille du code. Sur les processeurs modernes, un code plus petit s'exécute généralement plus rapidement en raison d'une meilleure utilisation du cache d'instructions. - Consignes Google
Les avantages de vitesse des fonctions en ligne ont tendance à diminuer à mesure que la fonction grandit. À un moment donné, la surcharge de l'appel de fonction devient faible par rapport à l'exécution du corps de fonction, et l'avantage est perdu - Source
Il existe peu de situations où une fonction en ligne peut ne pas fonctionner:
Le
__inline
mot clé entraîne la mise en ligne d'une fonction uniquement si vous spécifiez l'option d'optimisation. Si optimiser est spécifié, le respect ou non__inline
dépend du réglage de l'option d'optimisation en ligne. Par défaut, l'option en ligne est en vigueur chaque fois que l'optimiseur est exécuté. Si vous spécifiez optimiser, vous devez également spécifier l'option noinline si vous souhaitez que le__inline
mot clé soit ignoré. -La sourcela source
inline
mot clé pour déterminer s'il faut ou non coder en ligne tous les points mentionnés ci-dessus sont erronés. Ils seraient vrais si le compilateur utilisait le mot-clé pour l'inlining (il n'est utilisé que pour déterminer le marquage de plusieurs définitions à des fins de liaison).