720 votes

Quand devrais-je écrire le mot-clé "inline" pour une fonction/méthode?

Question Principale

Quand devrais-je écrire le mot-clé 'inline' pour une fonction/méthode C++?


Edit:

Les Questions ajoutées en voyant quelques réponses...

  • Quand devrais-je pas écrire le mot-clé "inline" pour un fonction/méthode en C++?

  • Quand le compilateur ne pas savoir quand faire une fonction/méthode 'inline'?

  • Importe-t-il si une application est multithread quand on écrit 'inline' pour une fonction/méthode?

1122voto

deft_code Points 19418

Oh, l'homme, l'une de mes bêtes noires.

inline est plus de l' static ou extern qu'une directive indiquant au compilateur de vos fonctions inline. extern, static, inline sont de liaison directives, utilisé presque exclusivement par l'éditeur de liens, pas le compilateur.

Il est dit qu' inline conseils pour le compilateur que vous pensez que la fonction doit être insérée. Qui peut avoir été le cas en 1998, mais une décennie plus tard, le compilateur a besoin d'aucun de ces conseils. Ne pas oublier les humains sont généralement faux quand il s'agit de l'optimisation de code, de sorte que la plupart des compilateurs plat ignorer le "conseil".

static la variable nom de la fonction/ne peut pas être utilisé dans d'autres unités de compilation. L'éditeur de liens doit assurez-vous de ne pas utiliser accidentellement un définis de manière statique variable/fonction à partir d'une autre unité de compilation.

extern utilisation de cette variable nom de la fonction/dans cette unité de compilation, mais ne venez pas vous plaindre si elle n'est pas définie. L'éditeur de liens tri et assurez-vous tout le code qui a essayé d'utiliser certains extern symbole a son adresse.

inline cette fonction sera définie dans plusieurs unités de compilation, ne vous inquiétez pas à ce sujet. L'éditeur de liens doit s'assurer que toutes les unités de compilation utiliser une seule instance de la variable/fonction.

Note: Déclarer des modèles en direct est sans valeur. Ils ont le lien sémantique en ligne déjà.


Donc des réponses précises à vos questions:

  • Quand devrais-je écrire le mot-clé "inline" pour une fonction/méthode en C++?

Seulement quand vous voulez la fonction définie dans un en-tête. Plus exactement que lorsque la définition de la fonction peut apparaître dans plusieurs unités de compilation. C'est une bonne idée de définir petite (comme dans un liner) des fonctions dans le fichier d'en-tête, car il donne le compilateur plus d'informations pour travailler avec lors de l'optimisation de votre code. Il augmente également le temps de compilation.

  • Quand devrais-je pas écrire le mot-clé "inline" pour une fonction/méthode en C++?

N'ajoutez pas en ligne lorsque vous pensez que votre code sera exécuté plus rapidement si le compilateur inlines.

  • Quand le compilateur ne pas savoir quand faire une fonction/méthode 'inline'?

Généralement, le compilateur sera capable de faire mieux que vous. Cependant, le compilateur n'a pas la possibilité de code en ligne si elle n'a pas la définition de la fonction. Dans au maximum le code optimisé généralement toutes les méthodes privées sont inline si vous demandez pour elle ou pas.

Un côté pour empêcher l'in-lining dans GCC utiliser __attribute__(( noinline )) et dans visual studio __declspec(noinline).

  • Importe-t-il si une application multithread quand on écrit 'inline' pour une fonction/méthode?

Le Multithreading n'affecte pas l'in-lining, en quelque sorte.

30voto

BostonLogan Points 1067

Vous devez toujours explicitement inline votre fonction lorsque vous effectuez modèle de spécialisation (si la spécialisation est dans .h fichier)

23voto

Aric TenEyck Points 5434

1) aujourd'Hui, à peu près jamais. Si c'est une bonne idée d'incorporer une fonction, le compilateur va le faire sans votre aide.

2) Toujours. Voir #1.

(Modifié pour refléter le fait que vous avez cassé votre question en deux questions...)

15voto

Quand devrais-je pas écrire le mot-clé "inline" pour une fonction/méthode en C++?

Si la fonction est définie dans l' .cpp le fichier, vous devriez pas écrire le mot-clé.

Quand le compilateur ne pas savoir quand faire une fonction/méthode 'inline'?

Il n'y a pas une telle situation. Le compilateur ne peut pas faire une fonction inline. Tout ce qu'il peut faire est de l'inclure certains ou de tous les appels à la fonction. Il ne peut pas le faire si elle n'a pas le code de la fonction (dans ce cas, l'éditeur de liens doit le faire si elle est en mesure de le faire).

Importe-t-il si une application multithread quand on écrit 'inline' pour une fonction/méthode?

Non, ce n'est pas grave du tout.

2voto

DarkSquid Points 2366

En réalité, à peu près jamais. Tout ce que vous faites est ce qui suggère que le compilateur faire une fonction donnée en ligne (par exemple, remplacer tous les appels à cette fonction /w son corps). Il n'y a pas de garanties, bien sûr: le compilateur peut ignorer la directive.

Le compilateur va généralement faire un bon travail de détection + optimisation des choses comme ça.

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