0
votes

Pourquoi le compilateur ne fonctionne-t-il pas l'inlinage, si la fonction contient des variables statiques?

J'ai lu à partir du site Web suivant, que le compilateur peut ne pas effectuer d'inlinage lorsque la fonction a des variables statiques. Quelle est la raison?

Référence: Fonctions en ligne en C ++ < / p>

N'oubliez pas que l'inlinage n'est qu'une demande au compilateur et non une commande. Le compilateur peut ignorer la demande d'inlinisation. Le compilateur peut ne pas effectuer l'inlinage dans de telles circonstances telles que:

  1. Si une fonction contient une boucle. (Pour, alors que, tout comme)
  2. Si une fonction contient des variables statiques.
  3. Si une fonction est récursive.
  4. Si un type de retour de fonction est autre que le vide, et la déclaration de retour n'existe pas dans le corps de la fonction.
  5. Si une fonction contient une déclaration de commutation ou de goto.

8 commentaires

Cet article est obsolète. Dans moderne C ++, inline n'a rien à voir avec l'optimisation et affecte plutôt la liaison des variables et des fonctions. Voir EN.CPPREFERGENCE.COM/W/cpp/language/inline


Le compilateur incroyable une fonction uniquement lorsqu'il souhaite, et il souhaite généralement quand le résultat est une exécution plus rapide. Généralement, vous ne devriez pas vous inquiéter de ce qui est inlidé avant de détecter un problème lié à l'inlinage. Néanmoins, il ne me semble pas comme une telle question justifie un score négatif.


La variable statique "inlined" doit toujours "se référer" à la fonction d'origine originale (comme cette fonction pourrait être appelée plusieurs fois). Cette difficulté peut être supprimée en n'allant pas d'inliquer une telle fonction.


Ceci est discuté sur Meta .


Ceci est un cas particulier d'une FAQ. Avant d'envisager de poster, veuillez lire votre manuel et / ou manuel et Google tout message d'erreur ou de nombreuses phrases claires, concises et précises de votre question / problème / objectif, avec et sans vos chaînes / noms et site de Stackoverflow.com; lire de nombreuses réponses. Si vous postez une question, utilisez une phrase comme titre. Reflètent vos recherches. Voir Comment demander et les textes de stockage de la flèche votant.


Est-ce que cela répond à votre question? Quand les compilateurs en ligne C ++ Code C ++?


@philipxy, il ne répond pas à ma question.


Oui. Le compilateur peut choisir de ne pas en ligne pour une raison quelconque et en ligne pour une raison quelconque. Malheureusement, "peut ne pas effectuer" est ambigu en anglais - cela peut avoir de nombreuses significations. Pour que la citation soit correcte, cela doit vouloir dire "pourrait ne pas effectuer" quand ..., mais il est également vrai que cela pourrait se produire quand ... tu devrais clarifier ce que vous signifie " Peut ne pas effectuer "& ce que vous pensez que la citation pourrait signifier par elle, mais les réponses ici & sur le lien et dans de nombreux autres liens précisent clairement que cela pourrait, et ce n'est peut-être pas important ce que le site Web essaie dire.


3 Réponses :


3
votes

En général, le compilateur décidera quoi en ligne et non. Le mot-clé en ligne a changé pour signifier que quelque chose est autorisé à définir des définitions multiples.

Voici une citation de CPPreference

L'intention d'origine du mot-clé en ligne était de servir d'indicateur à l'optimiseur que la substitution en ligne d'une fonction est préférée sur l'appel de fonction, au lieu d'exécuter l'instruction CPU d'appel de fonction pour transférer le contrôle sur le corps de la fonction, Une copie de l'organisme de fonction est exécutée sans générer l'appel. Cela évite les frais généraux créés par l'appel de la fonction (transmettre les arguments et récupérer le résultat), mais il peut entraîner une exécutable plus grande car le code de la fonction doit être répété plusieurs fois.

Étant donné que cette signification du mot-clé Inline est non contraignante, les compilateurs sont libres d'utiliser une substitution en ligne pour toute fonction non marquée intégrée et sont libres de générer des appels de fonction vers une fonction marquée en ligne marquée. Ces choix d'optimisation ne modifient pas les règles concernant plusieurs définitions et statiques partagées énumérées ci-dessus.

Parce que la signification du mot-clé Inline pour les fonctions est venue à signifier "les définitions multiples sont autorisées" plutôt que "l'affranchissement étant préférée", cette signification a été étendue aux variables.


0 commentaires

2
votes

compilateurs peut totalement des fonctions en ligne avec des variables statiques, des relevés de commutation et même des fonctions récursives.

Voici un exemple: xxx

et voici le code de montage que le code de montage compilateur généré : xxx

remarque que dans le Code de montage, il n'y a pas d'appel à FOO ou FOO2 dans la fonction principale . L'ajout des éléments de tableau est effectué par les instructions MOV ESI, DWORD PTR [RSP + 8] , Ajouter ESI, DWORD PTR [RSP + 4] et Ajouter ESI, DWORD PTR [RSP + 12] au milieu de la fonction principale principale. L'article est soit faux, soit il a utilisé "peut ne pas" signifier "pourrait ne pas" "au lieu de" n'est pas autorisé à ". Ce dernier cas aurait un sens parce que le compilateur est moins susceptible de souscrire des fonctions plus grandes et plus complexes.

également, comme expliqué dans les autres réponses, les compilateurs peuvent des fonctions en ligne sans le en ligne mot-clé. Si vous supprimez le mot-clé inline de l'exemple ci-dessus, le compilateur va toujours en ligne la fonction.


2 commentaires

Compilateurs Certainement peut , mais ils ne sont pas requis de le faire. C'est le point de l'explication citée. En fait, l'explication pourrait aller encore plus loin: inline jamais des obligations sur le compilateur en ce qui concerne la génération de code en ligne.


@Codygray L'OP semble avoir l'impression que les compilateurs ne sont pas autorisés à des fonctions en ligne avec des boucles, des relevés de commutation ou de la récursivité, donc j'ai démontré que ce n'est pas le cas si en ligne a été utilisé ou non. J'ai supposé que l'OP sait que les compilateurs ne sont pas tenus de créer des fonctions en ligne marquées par en ligne car cela était clairement indiqué dans l'article lié.



2
votes

Lorsque l'article dit "Peut ne pas exercer", je pense que cela signifie "pourrait ne pas effectuer" voir comment cette phrase passe peu de temps après "peut ignorer". Si tel est le cas, le compilateur n'a pas vraiment besoin de raison pour ne pas inliquer une fonction. Le compilateur s'inlande à sa propre discrétion.

Néanmoins, il s'agit généralement d'une raison pour quels compilateurs font et ne font pas. Les compilateurs plus récents sont plus aptes aux fonctions d'inlinage que les plus âgés. Il est possible que l'auteur de l'article ait expérimenté un compilateur qui manquait simplement de support pour des fonctions en ligne avec des variables statiques. Je m'attendrais à ce que les nouveaux compilateurs ne disposent pas de cette limitation.

Gardez à l'esprit l'âge des informations lors de l'évaluation des limitations des compilateurs. Je ne vois pas une date pour cet article. Ses commentaires s'étendent trois ans, cependant (et ses informations semblent plus âgées que cela). Beaucoup peut arriver sur trois ans. Les compilateurs évoluent et vont mieux. Ce qui avait été impossible peut-être devenu banal.

Sans oublier que le thème majeur de cet article est hors base. Le mot clé inline en C ++ n'a rien eu à faire avec si une fonction est inline depuis au moins C ++ 98 (il y a vingt-deux ans).


0 commentaires