web-dev-qa-db-fra.com

Comment saurai-je si la fonction inline est effectivement remplacée à l'endroit où elle est appelée ou non?

Je sais que les fonctions en ligne sont remplacées là où elles s'appellent ou se comportent comme des fonctions normales.

Mais comment saurai-je si la fonction inline est effectivement remplacée à l’endroit où elle est appelée ou non en tant que décision de traiter la fonction inline comme si elle était inline au moment de la compilation?

34
Abhineet

Par programmation, à l'exécution, vous ne pouvez pas.
Et la vérité est que:vous n'avez pas besoin de savoir

Un compilateur peut choisir de inline fonctions qui ne sont pas marquées inline ou d'ignorer les fonctions marquées explicitement inline. C'est tout à fait le souhait (lire sagesse) du compilateur. La plupart des compilateurs traditionnels feront bien leur travail.

Si votre question est purement académique, vous avez le choix entre plusieurs options:


Analyser le code d'assemblage généré:

Vous pouvez vérifier le code d'assemblage pour vérifier si le code de fonction est en ligne au moment de l'appel.

Comment générer le code d'assemblage?

Pour gcc:
Utilisez le commutateur -S pendant la compilation.
Par exemple:

g++ -S FileName.cpp

Le code d'assemblage généré est créé dans le fichier FileName.s.

Pour MSVC:
Utilisez le commutateur/ FAdepuis la ligne de commande.

Dans la recherche de code d'assemblage générée, s'il existe une instruction d'assemblage call pour la fonction concernée.


Utilisez les avertissements et diagnostics spécifiques au compilateur:

Certains compilateurs émettront un avertissement s’ils ne parviennent pas à satisfaire une demande de fonction en ligne.
Par exemple, dans gcc, l’option de commande -Winline émettra un avertissement si le compilateur n’inline pas une fonction déclarée inline.

Consultez la documentationGCCpour plus de détails:

-Winline

Avertir si une fonction déclarée comme inline ne peut pas être en ligne. Même avec cette option, le compilateur ne prévient pas des défaillances des fonctions en ligne déclarées dans les en-têtes du système.

Le compilateur utilise diverses méthodes heuristiques pour déterminer si une fonction doit être intégrée ou non. Par exemple, le compilateur prend en compte la taille de la fonction en cours d’inscription et la quantité d’inscriptions en ligne déjà effectuée dans la fonction actuelle. Par conséquent, des modifications apparemment insignifiantes dans le programme source peuvent provoquer l’apparition ou la disparition des avertissements générés par -Winline.

57
Alok Save

Vérifiez le code généré. Si la fonction est développée, vous verrez son corps, par opposition à une instruction call ou similaire.

10
Luchian Grigore

Vous pouvez utiliser des outils pour lister les symboles à partir de fichiers objets tels que nm sur Linux. Si la fonction était en ligne, elle ne sera pas répertoriée dans la sortie nm - elle est devenue une partie d'une autre fonction. De plus, vous ne pourrez pas définir de point d'arrêt sur cette fonction par nom dans le débogueur.

7
ks1322

Si vous devez vous assurer que cette fonction est en ligne et que vous pouvez utiliser l'extension propriétaire dans MS VC++, consultez le déclarateur __forceinline . Le compilateur insère la fonction en ligne ou, s'il fait partie de la liste des cas spéciaux documentés, vous recevez un avertissement vous permettant de connaître l'état de la ligne.

Ne l'approuvant en aucune façon.

4
Vlad Didenko

Avec gdb, si vous ne pouvez pas appeler une fonction, l’une de ses significations possibles est que la fonction est inline. Inverser le raisonnement, si vous pouvez appeler une fonction dans gdb, signifie que la fonction n'est pas marquée en ligne.

4
Peregring-lk

La décision d'inclure ou non une fonction est prise par le compilateur. Et comme il est fait par compilateur, alors OUI, il ne peut être fait qu’à la compilation.

Ainsi, si vous pouvez voir le code d'assemblage à l'aide de l'option -S (avec gcc, -S produit un code d'assemblage), vous pouvez voir si votre fonction a été intégrée ou non.

3
saurabh jindal
  1. voir la taille des fichiers objet, ils sont différents entre en ligne et non en ligne
  2. utilise nm "obj_file" | grep "fun_name", ils sont aussi différents
  3. gcc -Winline -O1
  4. comparer avec le code d'assemblage
0
李鹏程

Les réponses ci-dessus sont très utiles, je ne fais qu’ajouter un point que nous gardons à l’esprit lors de l’écriture de la fonction inline.

Rappelez-vous que l'inline n'est qu'une requête adressée au compilateur, pas une commande. Le compilateur peut ignorer la demande d'inline. Le compilateur peut ne pas effectuer la mise en ligne dans des circonstances telles que :

1) Si une fonction contient une boucle. (pour, pendant que vous faites)

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 void et que l’instruction de retour n’existe pas dans le corps de la fonction.

5) Si une fonction contient une instruction switch ou goto.

Information complète: https://www.geeksforgeeks.org/inline-functions-cpp/

0