39 votes

Quel est le problème avec l'aide de fonctions inline?

Alors qu'il serait très pratique de pouvoir utiliser les fonctions inline à certaines situations,

Existe-il des inconvénients avec les fonctions inline?

Conclusion:

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:

    • Pour une fonction retournant des valeurs; si une instruction de retour existe.
    • Pour une fonction ne retourne pas de valeurs; si une boucle, d'un commutateur ou d'instruction goto existe.
    • Si une fonction est récursive. -Source
  • L' __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 l' __inline mot-clé pour être ignoré. -Source

22voto

Alan Points 7273

Il est intéressant de souligner que le mot-clé inline est en fait juste une indication pour le compilateur. Le compilateur peut ignorer la ligne et tout simplement de générer le code pour la fonction de quelque part.

Le principal inconvénient de fonctions inline, c'est qu'il peut augmenter la taille de votre exécutable (selon le nombre d'instanciations). Cela peut être un problème sur certaines plates-formes (par exemple. les systèmes embarqués), en particulier si la fonction est récursive.

Je recommande aussi faire inline avais fonctions très faible ,- La vitesse des avantages 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.

14voto

Jeremy Ruten Points 59989

Il pourrait augmenter la taille de la exécutable, et je ne pense pas que compilateurs toujours fait faire leur inline même si vous avez utilisé l' mot-clé inline. (Ou est-ce l'autre chemin, comme ce Vaibhav a dit?...)

Je pense que c'est généralement OK si l' la fonction a seulement 1 ou 2 états.

Edit: Voici ce que le linux CodingStyle document dit à ce sujet:

Chapitre 15: La ligne de la maladie

Il semble être un bon perception erronée que le gcc a une magie "faites-moi plus vite" speedup option appelée "inline". Alors que l'utilisation des inlines peut appropriée (par exemple, comme un moyen de remplacer les macros, voir le Chapitre 12), très souvent ne l'est pas. L'utilisation abondante de le mot-clé inline conduit à un bien plus gros noyau, qui à son tour ralentit le de l'ensemble du système vers le bas, en raison d'un plus icache empreinte pour le CPU et tout simplement parce que il y a moins de mémoire disponible pour le pagecache. Il suffit de penser, une façon de pagecache manquer provoque une recherche de disque, qui prend facilement 5 millisecondes. Il y a BEAUCOUP de cpu des cycles qui peuvent aller dans ces 5 milisecondes.

Raisonnable de la règle de base est de ne pas mettre inline à des fonctions qui ont plus de 3 lignes de code en eux. Un exception à cette règle est le cas lorsqu'un paramètre est connu pour être un compile-time constant, et comme un résultat de ce constantness vous savezle le compilateur va être en mesure d'optimiser la plupart de votre fonction à l'écart au moment de la compilation. Pour un bon exemple de ce dernier cas, voir la kmalloc() de la fonction inline.

Souvent, les gens font valoir que l'ajout d'inline pour les fonctions qui sont statiques et utilisé une seule fois est toujours une victoire puisqu'il n'y aucun espace de compromis. Alors que c'est techniquement correcte, gcc est capable de inline automatiquement sans de l'aide, et le problème d'entretien de suppression de la ligne lors d'un autre utilisateur apparaît l'emporte sur la valeur potentielle de l'indice qui indique gcc à faire quelque chose, il l'aurait fait de toute façon.

6voto

user10042 Points 116

Il y a un problème avec inline - une fois que vous avez défini une fonction dans un fichier d'en-tête (ce qui implique à la volée, de façon explicite ou implicite par la définition d'un corps d'un membre de la fonction à l'intérieur de la classe) il n'y a pas de moyen simple de les modifier sans forcer les utilisateurs à recompiler (par opposition à relier). Souvent, cela pose des problèmes, surtout si la fonction en question est défini dans une bibliothèque et d'en-tête est une partie de son interface.

4voto

Niall Points 2074

Comme d'autres l'ont mentionné, le mot-clé inline n'est qu'une indication pour le compilateur. En effet, plus les compilateurs modernes d'ignorer complètement cette indication. Le compilateur a sa propre méthode heuristique pour déterminer si pour une fonction inline, et franchement, ne veut pas de vos conseils, merci beaucoup.

Si vous avez vraiment, vraiment envie de faire quelque chose en ligne, si vous avez réellement profilé et regardé le démontage de s'assurer que des raisons impérieuses le compilateur heuristique fait réellement sens, alors il est possible:

  • Dans VC++, utilisez l' __forceinline mot-clé
  • Dans GCC, utiliser __attribute__((always_inline))

Le mot-clé inline ne une seconde, avec un objectif valable toutefois - déclarer les fonctions dans les fichiers d'en-tête, mais pas à l'intérieur d'une définition de classe. Le mot-clé inline est nécessaire pour indiquer au compilateur de ne pas générer de multiples définitions de la fonction.

4voto

maccullt Points 1555

Je suis d'accord avec les autres postes:

  • inline peut-être superflue, car le compilateur va le faire
  • inline peut gonfler votre code

Un troisième point est qu'il peut vous forcer à exposer les détails de mise en œuvre dans vos en-têtes, des .e.g.,

class OtherObject;

class Object {
public:
    void someFunc(OtherObject& otherObj) {
        otherObj.doIt(); // Yikes requires OtherObj declaration!
    }
};

Sans la ligne une déclaration anticipée de OtherObject a tous vous avez besoin. Avec la ligne de votre en-tête de la définition de OtherObject.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X