Question

Si je définis une fonction non-membre dans un en-tête, il sera toujours par être mise en ligne le compilateur, ou le compilateur sur ses choix en fonction heuristiques? Je sais que __inline est juste un soupçon, est-ce la même chose avec des fonctions en-têtes?

Était-ce utile?

La solution

Rappelez-vous que, y compris quelque chose d'un en-tête est pas différent de simplement taper directement dans le fichier source. Donc, étant en-tête ne fait aucune différence pour autant que le compilateur est concerné; il n'a jamais su qu'elle était là.

Ainsi, lorsque vous définissez une fonction dans un fichier d'en-tête, et d'inclure ce fichier d'en-tête dans un fichier, il est comme vous venez de taper la fonction directement dans le fichier. Alors maintenant, la question est, « le compilateur choisir inline choses basées sur des heuristiques? »

La réponse est « ça dépend du compilateur ». La norme ne donne aucune garantie sur ce qui se fait inline ou non. Cela dit, tout compilateur moderne sera extrêmement intelligent sur ce qu'il inline, probablement avec heuristiques.

Cependant, nous arrivons à un point intéressant. Imaginez que vous avez une fonction dans un en-tête et vous inclure cet en-tête dans les fichiers sources multiples. Vous aurez alors plusieurs définitions de la fonction, à travers des unités de traduction, et cela constitue une violation de la règle d'une définition. Ergo, vous obtiendrez des erreurs de compilation. (L'erreur de liaison est habituellement quelque chose le long des lignes de: « Erreur, la fonction x déjà définie dans y »). Ce que vous pouvez faire est d'utiliser le mot-clé inline et vous ne violent plus le ODR

Par la __inline manière est non standard. Contrairement à votre poste, il est généralement une extension du compilateur qui forces inline, conseils pas. inline est le mot-clé standard, ce qui était à l'origine destiné à faire allusion à inline. Comme vous le dites, la plupart des compilateurs modernes ignorent complètement à cet égard et il est le seul but est aujourd'hui de donner aux choses une liaison interne.

Autres conseils

De C ++ FAQ Lite :

  

Peu importe la façon dont vous désignez une fonction   en ligne, il est demandé que le   compilateur est autorisé à ignorer: il   pourrait inline-développer certains, tous ou aucun   des appels à une fonction en ligne.

Il choisirons basé sur des heuristiques. Assurez-vous que vous déclarez comme ligne explicitement autrement vous pouvez obtenir une erreur de lien de symbole en double si vous incluez l'en-tête dans plus d'une unité de compilation.

Si vous définir une fonction avec lien externe dans un fichier d'en-tête et l'inclure dans plus d'une unité de traduction, vous obtiendrez une erreur de compilation (plus précisément: erorr linker) pour violation d'une définition règle (ODR). Donc, la réponse est « non »: la définition d'une fonction dans un fichier d'en-tête ne sera pas prise par le compilateur comme une allusion à inline et ne vous excusez d'observer les exigences de l'ODR. Non seulement ces fonctions ne sont pas garanties à inline, mais très probablement votre programme ne sera même pas compiler.

Pour définir une fonction dans un fichier d'en-tête et de sortir avec lui, vous devez soit lui donner une liaison interne (déclarer static, et finissent avec une fonction distincte dans chaque unité de traduction), ou déclarer explicitement inline.

En ce qui concerne les heuristiques ... compilateurs modernes considérera normalement que pratiquement toutes les fonctions pour inline (en appliquant heuristiques), quel que soit l'endroit où il est défini et si elle est explicitement déclarée inline ou non.

Il n'y a pas de magie sur les fonctions des en-têtes. Le compilateur ne sait même pas si une fonction est définie dans un en-tête ou non. (Comme les en-têtes sont effectivement il suffit de copier / coller dans le fichier source, vous pouvez définir dans un en-tête, mais le compilateur ne voit que dans le cadre de l'unité de traduction)

Il y a aussi deux significations différentes de « en ligne » à savoir:

Une fonction peut être inline tel que défini par la norme C ++: Cela se fait soit en préfixant la fonction avec le mot-clé inline, ou si elle est une fonction membre, en la définissant en place à l'intérieur la définition de classe.

L'effet de ceci est à

  • informer l'éditeur de liens qu'il peut rencontrer la définition de fonction dans plusieurs fichiers, et il devrait juste les fusionner en silence ensemble au lieu de lancer une erreur
  • le rendre plus facile pour le compilateur d'effectuer la inline Optimisation .

Le inline Optimisation d'autre part, est tout simplement l'acte de remplacement d'un appel de fonction par le corps de la fonction appelée, ce qui signifie que cette optimisation est effectivement appliquée à appeler d'autres sites, et non aux fonctions . Une fonction peut être appelée normalement certains endroits, mais inline ailleurs. Un appel de fonction est inline lorsque le compilateur se sent comme, et il est préférable de séparer conceptuellement entièrement de la première signification de « en ligne ».

Le compilateur appliquera l'optimisation de inline si, quand et où il se sent comme ça. Il utilise beaucoup de heuristiques pour cela. fonctions plus petites sont plus susceptibles d'être inline. Si elle détermine qu'un site d'appel spécifique va être exécuté suffisamment souvent, il est plus susceptible d'être mise en ligne. En fin de compte, les heuristiques qu'il utilise sont basées sur « elle améliorer ou dégrader les performances ». Et il est généralement un meilleur juge de ce que les êtres humains, de sorte que vous ne devriez pas vraiment besoin de savoir ce que heuristiques précise qu'il utilise. Inline trop ne les performances du mal.

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