Question

Je comprends que vous pouvez utiliser le mot clé inline ou simplement mettre une méthode dans une déclaration de classe ala short ctor ou une méthode getter, mais le compilateur prend-t-il la décision finale quant au moment auquel inline mes méthodes?

Par exemple:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}

Le compilateur ignorera-t-il ma déclaration en ligne s'il pense que cela rendra mon code inefficace?

En tant que problème secondaire, si une méthode getter est déclarée en dehors de ma classe, comme suit:

void Foo::bar() { std::cout << "baz"; }

Le compilateur insérera-t-il cela sous les couvertures?

Était-ce utile?

La solution

Qu'une ligne soit en ligne ou non est, en fin de compte, entièrement jusqu'à le compilateur. En règle générale, plus une fonction est complexe en termes de flux, moins le compilateur est susceptible de la mettre en ligne. et certaines fonctions, telles que les fonctions récursives, ne peuvent tout simplement pas être en ligne.

La principale raison pour ne pas inclure une fonction dans la ligne est que cela augmenterait considérablement la taille globale du code, ce qui empêcherait que celle-ci ne soit conservée dans le cache du processeur. Ce serait en fait une pessimisation plutôt qu'une optimisation.

Pour laisser le programmeur décider de se tirer une balle dans le pied ou ailleurs, vous pouvez intégrer la fonction vous-même - écrivez le code qui aurait été utilisé dans la fonction sur ce qui aurait été le site d'appel de la fonction.

Autres conseils

Oui, la décision finale d'inclure ou non votre code dans le code appartient au compilateur C ++. Le mot clé en ligne est une suggestion, pas une exigence.

Voici quelques détails sur le traitement de cette décision dans le compilateur Microsoft C ++

Comme beaucoup d’entre eux l’ont déjà publié, la décision finale appartient toujours au compilateur, même si vous pouvez donner des conseils fermes tels que forceinline.
Une partie de la logique est que l’inscription en ligne n’est pas automatique. commutateur. Trop d'inline peut rendre votre code beaucoup plus volumineux et interférer avec d'autres optimisations. Voir C ++ FAQ sur les fonctions et les performances en ligne .

Comme d'autres l'ont noté, le mot clé inline est simplement une suggestion au compilateur d'intégrer le code. Comme le compilateur utilisera régulièrement du code en ligne qui n’a pas été marqué avec inline , et non du code en ligne qui l’a été, le mot clé semble aussi redondant que register ou (pre-C ++ 0x) auto .

Cependant, le mot clé inline a un autre effet: il modifie le lien de la fonction de la fonction à partir de external fonctions) à inline . La liaison en ligne permet à chaque unité de compilation de contenir sa propre copie du code de l'objet, et l'éditeur de liens supprime les copies redondantes de l'exécutable final. Si cela vous rappelle des modèles, oui, les modèles utilisent également le couplage en ligne.

Oui, le compilateur a la décision finale. Dans le VS, vous pouvez même intégrer des fonctions récursives dans la profondeur spécifiée ;)

#pragma inline_depth( [0... 255] )

Juste pour ajouter mes 5 centimes ...

J'ai trouvé cet article de Guru of Week à propos de l'inlining très utile.

Autant que je me souvienne, j'ai lu quelque part que même un éditeur de liens pourrait faire l'inline, lorsqu'il lie les fichiers d'objet et découvre que le code lié peut être en ligne.

Cordialement,
Ovanes

  

En tant que problème secondaire, si une méthode getter est déclarée en dehors de ma classe, comme suit:

void Foo::bar() { std::cout << "baz"; }
  

Le compilateur mettra-t-il cela en ligne sous les couvertures?

Cela dépend. Il peut être utilisé par tous les appelants appartenant à la même unité de traduction (le fichier .cpp et toutes ses définitions #included). Mais il doit encore compiler une version non en ligne car il peut y avoir des appelants de cette fonction en dehors de l'unité de traduction. Vous pouvez potentiellement voir cela au travail (si votre compilateur peut réellement le faire) à des niveaux d'optimisation élevés. (En particulier: comparez ce qui se passe lorsque vous incluez tous vos fichiers .cpp dans un fichier .cpp par rapport à la présentation habituelle. Avec toutes les définitions dans une unité de traduction, les possibilités d’une telle insertion augmentent considérablement.)

Selon mes connaissances, le compilateur rendra automatiquement une fonction que vous avez déclarée inline (ou écrite dans une déclaration de classe) non-inline si elle trouve une boucle comme pour, while, etc. C'est un exemple où le compilateur a le dernier mot dans les fonctions en ligne.

Si vous avez réellement, absolument, absolument, BESOIN d’aligner le code, il y a toujours la macro. C les prend en charge depuis des années et, comme ils ne font que remplacer le texte avant la compilation, ils incorporent vraiment ce que vous écrivez.

C'est pourquoi le mot clé "inline" (et même, dans certains cas, les variantes forcées) peut se permettre de ne pas avoir un moyen standard de le forcer - vous pouvez toujours simplement écrire une macro.

Cela dit, le mot clé inline est souvent préférable, car le compilateur sait assez souvent s'il est logique de créer une fonction inline, et parce qu'il peut interagir avec le reste des optimisations du compilateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top