Les compilateurs compatibles c ++ 11 ignorent-ils toujours les astuces en ligne?

Lecture d’une ancienne réponse sur Quand dois-je écrire le mot clé ‘inline’ pour une fonction / méthode? ça dit:

Il est dit que le compilateur indique en ligne que la fonction devrait être en ligne. C’était peut-être vrai en 1998, mais une décennie plus tard, le compilateur n’a plus besoin de ces indications. Sans parler des humains, ils ont généralement tort quand il s’agit d’optimiser le code. La plupart des compilateurs ignorent donc totalement cet “indice”.

Cette réponse a été postée en 2009, alors je veux la comprendre:

  1. Les compilateurs modernes compatibles avec c ++ 11 ignorent-ils toujours inline astuces en inline spécifiées par l’utilisateur et le font uniquement automatiquement?
  2. Les astuces en inline ne restnt-elles que pour offrir une compatibilité ascendante?
  3. Si non 1. alors cette réponse est incorrecte?

  1. Les compilateurs modernes compatibles avec c ++ 11 ignorent-ils toujours les astuces en ligne spécifiées par l’utilisateur et le font uniquement automatiquement?

C ++ 11 n’est pas pertinent ici, le standard C ++ 11 n’a pas changé la sémantique d’ inline et les optimisations du compilateur sont largement indépendantes de la version du langage compilé.

  1. Les astuces en ligne ne restnt-elles que pour offrir une compatibilité ascendante?

Non, inline n’est pas un indice, et le compilateur ne “ignore” pas inline car, s’il le faisait, vous obtiendriez plusieurs erreurs de définition. La signification que le compilateur donne au mot clé en inline n’est pas la signification que vous semblez comprendre. Ce n’est pas un indice.

Si le compilateur ne peut pas voir la définition de la fonction, il ne peut pas l’aligner (l’optimisation de Link-Time change, mais l’utilisation de LTO n’est pas encore très répandue et la plupart des bibliothèques ne sont pas livrées avec des binarys activés pour LTO qui autoriseraient link-time. en ligne).

Vous devez lire inline comme suit: “cette définition de fonction apparaît inline dans ce fichier” et non “les appels à cette fonction doivent être en ligne”.

Le mot-clé inline est donc utile pour permettre au compilateur de voir les définitions de fonctions dans plusieurs fichiers, ce qui signifie qu’il est possible d’optimiser les appels en les alignant. Cela ne la rend pas nécessairement plus susceptible d’être en ligne que toute autre fonction définie dans la même unité de traduction.

Pour les fonctions appelées à partir de plusieurs unités de traduction, définir les fonctions dans les en-têtes et les rendre en inline est une condition nécessaire pour que le compilateur les mette en ligne, mais cela ne suffit pas (car le compilateur fonde ses décisions en ligne sur d’autres conditions).

Cela n’a rien à voir avec la compatibilité en amont, c’est tout aussi vrai qu’en 2009.

  1. Non, ils l’interprètent simplement comme l’exige la norme, mais certains compilateurs ne peuvent rien faire de plus (selon la documentation choisie par MSVC en fonction de la présence du mot clé inline , GCC 5.1.0 prend également en considération inline mot clé inline pour décider). .
  2. Non, inline est nécessaire pour éviter les symboles en double lors de la création de liens.

Le mot clé en inline a une signification, mais pas la signification à laquelle vous pouvez vous attendre. Cela ne signifie pas que le compilateur doit / devrait / pourrait développer la fonction en ligne, qu’il pourrait décider de le faire comme bon lui semble, que vous inline ou non.

Cela signifie que vous devez et pouvez répéter la définition de la fonction dans chaque unité de compilation où elle est utilisée, sans générer d’erreurs de liaison, ce qui est assez similaire au mot clé static .

Par exemple, GCC 4.7.2 (qui n’est peut-être pas à la pointe de la technologie, mais qui rest un compilateur assez moderne) ne semble pas interpréter en inline pas plus que ce que spécifie la norme. Il ne semble pas que la fonction soit intégrée si l’optimisation est désactivée et, si l’optimisation est activée, elle semble y être intégrée comme bon lui semble. La seule différence est la manière dont le compilateur gère la fonction “décrite” dans les différents cas. Inline le supprime simplement ou le traite d’une manière qui éviterait les symboles en double au moment du lien.

Les compilateurs C ++ 11 suivent les indications en ligne de la même manière que C ++ 03 ou n’importe quelle édition du langage.

Toutefois, notez que le mot clé inline n’est pas un indice en ligne. Les __atsortingbute__((always_inline)) ressemblent davantage à __atsortingbute__((always_inline)) .

Le mot clé inline (ou le statut inline implicite, appliqué aux modèles, etc.) indique qu’une fonction est définie dans un en-tête. L’éditeur de liens doit donc pouvoir en voir plusieurs copies lors de la combinaison d’unités de traduction (fichiers .cpp ). Il est nommé ainsi car la définition doit être disponible pour pouvoir intégrer une fonction, ce qui signifie que les fonctions dans les bibliothèques doivent être en inline pour être pratiquement en inline .