Peut-on voir le modèle instancié code par le compilateur C++
est-il un moyen de savoir le compilateur instancié code pour une fonction de modèle ou d'une classe en C++
Assumer, j'ai le morceau de code suivant
template < class T> T add(T a, T b){
return a+b;
}
maintenant quand je l'appelle
add<int>(10,2);
Je voudrais savoir la fonction que le compilateur crée pour int version spécifique.
J'utilise G++, VC++. Il sera utile si certains peuvent m'aider à souligner les options du compilateur pour atteindre cet objectif.
Espère que la question est claire. Merci à l'avance.
- Voulez-vous voir la fonction en C++ ou en assemblée? Si dans l'assemblage, à l'utilisation
g++ -S
. - Un étroitement liés à la question: stackoverflow.com/q/4332286/57428
Vous devez vous connecter pour publier un commentaire.
Vous pouvez certainement voir le code assembleur généré par le g++ à l'aide de l'option "-S".
Je ne pense pas qu'il est possible d'afficher le "C++" équivalent de code de modèle, mais je veux encore un g++ développeur à carillon pourquoi - je ne connais pas l'architecture de la gcc.
Lors de l'utilisation de l'assemblage, vous pouvez consulter le code résultant de la recherche de ce qui ressemble à votre fonction. En tant que résultat de l'exécution de gcc-S -O1 {yourcode.cpp}, je l'ai obtenu (AMD64, gcc 4.4.4)
Qui est vraiment juste un int addition (leal).
Maintenant, comment décoder le c++ name mangler? il existe un utilitaire appelé c++filt, vous collez le canoniques (C-l'équivalent) nom et vous obtenez le demangled c++ équivalent
Si vous voulez voir l'assemblée de sortie, utilisez ceci:
Si vous voulez voir des (pseudo -) code C++ généré par GCC, vous pouvez utiliser ceci:
Pour votre
add
fonction, ce sera quelque chose de sortie(J'ai passé l'paramètres par référence à la sortie d'un peu plus intéressant)
Clang (https://clang.llvm.org/) peut pretty-print AST de instancié modèle:
Pour votre exemple:
test.cpp
Commande pour pretty-print AST:
Clang-5.0 sortie:
La méthode la plus simple consiste à inspecter l'assembly généré. Vous pouvez obtenir un assemblage source à l'aide de -indicateur S de g++.
Lorsque l'optimiseur a fait de ses actes, vous avez probablement rien qui ressemble à un appel de fonction. Dans votre exemple, vous allez certainement vous retrouver avec un inline plus, au pire. Autre que cela, vous pouvez toujours émettre l'assembleur généré dans un fichier séparé lors de la compilation, et c'est là que réside votre réponse.
Si vous cherchez l'équivalent de code C++ alors non. Le compilateur génère jamais il. C'est beaucoup plus rapide pour le compilateur pour générer la représentation intermédiaire d'emblée que pour générer du c++ en premier.