inline et bonnes pratiques

Dupliquer possible:
Quand utiliser la fonction en ligne et quand ne pas l’utiliser?

J’ai vu de nombreux codes sources utilisant différentes syntaxes concernant la directive inline .

 namespace Foo { class Bar { public: // 1 - inline on the declaration + implementation inline int sum1(int a, int b) { return a + b; } // 2 - inline on template declaration + implementation template  inline T sum2(T a, T b) { return a + b; } // 3 - Nothing special on the declaration... int sum3(int a, int b); }; // 3 - But the inline directive goes after // In the same namespace and still in the header file inline int Bar::sum3(int a, int b) { return a + b; } } 

Je n’ai pas trouvé de directives «officielles» concernant l’utilisation d’ inline : je sais seulement que inline est juste un indice pour le compilateur et qu’il impose un lien interne . Je ne sais pas grand chose à ce sujet.

Voici mes questions:

  • Est-ce que (1) est une bonne pratique?
  • Dans (2), la directive inline est-elle toujours nécessaire? (Je suppose que ce serait “non”, mais je ne peux pas expliquer pourquoi). Quand est-ce nécessaire?
  • (3) semble être la syntaxe la plus utilisée. Y a-t-il un problème ou dois-je l’utiliser aussi?
  • Existe-t-il une autre utilisation (syntaxe) d’ inline je n’ai pas connaissance?

Non et non! inline n’est pas simplement un indice pour le compilateur et il n’impose pas de lien interne.

inline est implicite sur les fonctions définies dans un corps de classe, vous n’en avez donc besoin que sur les fonctions définies en dehors des classes. Vous devez l’utiliser quand, et seulement quand, vous devez activer les modifications apscopes à la règle de définition unique introduite.

En ce qui concerne vos questions:

  1. Cela ne semble pas être un bon usage, car toute fonction membre implémentée dans le corps d’une classe est implicitement marquée en ligne. En d’autres termes, cette déclaration en ligne particulière est redondante. Cela dit, cette fonction elle-même est un bon candidat pour l’inscription en ligne, car elle est petite, courte et utilise probablement plus d’instructions d’assemblage à appeler qu’à exécuter.

  2. Le mot-clé en ligne n’est pas nécessaire ici pour deux raisons. Tout d’abord, la fonction est une fonction membre implémentée dans le corps d’une classe, elle est donc implicitement inline. Deuxièmement, la fonction est un modèle et il vous suffit de marquer les fonctions définies dans les en-têtes en ligne si ce ne sont pas des fonctions de modèle. Cependant, il s’agit d’un bon candidat pour une fonction en ligne pour les raisons indiquées ci-dessus.

  3. C’est un excellent candidat pour une fonction en ligne et vous utilisez parfaitement le mot clé ici. C’est une fonction courte qui pourrait vraiment en bénéficier.

  4. Non, ce sont toutes les utilisations syntaxiques. Vous semblez savoir ce que vous faites! 🙂

Il n’est pas nécessaire d’utiliser le mot clé inline, sauf lorsque vous implémentez entièrement une fonction libre dans un fichier d’en-tête. Cela indique à l’éditeur de liens que plusieurs symboles (en double) pour cette fonction doivent pouvoir exister, et l’éditeur de liens doit réduire cela à une seule instance.

Par défaut, si vous déclarez et définissez une fonction dans la classe, celle-ci sera inline. Inline est une demande adressée au compilateur, qui décide si elle sera intégrée ou non. Dans le cas d’inline, le corps de la fonction s’est développé dans le code où il a été appelé. Si la fonction est grande et comporte plusieurs cas de boucle et de commutateur, le compilateur ignore la demande en ligne et la traite comme une fonction simple. De manière simple, le comportement en ligne est identique à celui des pré-processeurs, mais les avantages et les inconvénients sont différents.