Y a-t-il un moyen de voir les fonctions par défaut (par exemple, constructeur de copie par défaut, opérateur d'affectation par défaut) généré par un compilateur tel que VC ++ 2008 pour une classe qui ne les définit pas? p>
5 Réponses :
Vous pouvez suivre le code avec le débogueur pour voir ce qui se passe. Par exemple: Définissez un point d'arrêt à la construction de 'B' par le constructeur de copie. La sortie d'assembleur à ce point dans le débogueur VC ++ 6 est la suivante: p> Le dernier est l'appel du constructeur de copie. Vous pouvez également tracer cela aussi si vous voulez plus de détails. P> Cependant, si votre question est "Comment puis-je voir le code C ++ pour le Copier Construct et al", la réponse est que vous ne pouvez pas, car Il n'y a pas non plus - le compilateur génère des assembleurs ou de la machine (selon votre compilateur) pour eux, pas C ++ Code. P> P>
avec le clang code> compilateur, vous pouvez les voir en passant le -AST-Dump code> argument. Clang est toujours en phase de développement, mais vous pouvez déjà l'utiliser pour ces choses: [js@HOST2 cpp]$ clang++ -cc1 -O1 -emit-llvm -o - main1.cpp | llc -march=c -o - | c++filt
[snippet]
void A::A()(struct l_struct.A *llvm_cbe_this) {
*((&llvm_cbe_this->field0)) = ((&_ZTV1A.array[((signed int )2u)]));
return;
}
struct l_struct.A *A::operator=(A const&)(struct l_struct.A *llvm_cbe_this, struct l_struct.A
*llvm_cbe_tmp__1) {
unsigned int llvm_cbe_tmp3;
llvm_cbe_tmp3 = *((&llvm_cbe_tmp__1->field1));
*((&llvm_cbe_this->field1)) = llvm_cbe_tmp3;
return llvm_cbe_this;
}
void A::A(A const&)(struct l_struct.A *llvm_cbe_this, struct l_struct.A *llvm_cbe_tmp__2) {
unsigned int llvm_cbe_tmp3;
llvm_cbe_tmp3 = *((&llvm_cbe_tmp__2->field1));
*((&llvm_cbe_this->field1)) = llvm_cbe_tmp3;
*((&llvm_cbe_this->field0)) = ((&_ZTV1A.array[((signed int )2u)]));
return;
}
CAN CLANG fonctionne-t-il sur Windows 7? Je ne trouve aucun téléchargement pour MS Windows.
Pourquoi la "structure A;" fait partie du code généré dans ce qui suit struct A {public: struct A; en ligne A (); ...} code>
Avec clan 3.4.2 (cible: x86_64-redhat-linux-gnu) Je reçois une sortie différente pour le premier exemple avec la structure vide. Je reçois ce qui suit: branchantdecl 0x2fde550 << SLOC non valide >> | -TypeDefDecl 0x2fdea90 << SLOC NIVEAUX >> __INT128_T '__INT128' | -TYPEDEFDEFD0 << SLOC> Nonigned __int128 '| -TypedefDecl 0x2fdeebecl0 << SLOC invalide >> __builtin_va_list '__va_list_tag [1]' -cxxrecorddecl 0x2fdef00
Êtes-vous sûr d'avoir besoin de voir ces fonctions?
par défaut Le compilateur les crée en appelant le constructeur de copie ou l'opérateur d'affectation de chaque variable de membre. P>
Le problème avec c'est que lorsque vous Utilisez des objets qui utilisent le comptage de référence pour la gestion de données Le constructeur de copie par défaut créera une copie de l'objet mais non une copie des données les points de l'objet. Cela est également le cas pour les pointeurs. Donc, si vous avez une classe comme: p> Le constructeur de copie par défaut ne copie que les données A et le pointeur b. Cependant, il ne copie pas les données pointées par b. Si vous utilisez cette classe comme p> si vous souhaitez que cette classe copie la valeur de PTWO au lieu du pointeur, vous auriez besoin de votre propre fonction opérateur d'affectation de copie. Si vous êtes intéressé par plus de détails sur les fonctions par défaut et ce que vous n'élevez pas le livre "effectif c ++".
Il possède tout un chapitre sur ce sujet, ce qui explique quelles fonctions par défaut des classes ne font pas, ce qu'ils devraient faire, quand écrire le vôtre. Je suis sûr que vous pouvez obtenir une version numérique sur le Web si vous souhaitez simplement connaître cette fonctionnalité. p> p>
Les méthodes générées compilateur sont abstraites, elles n'existent pas dans le code source. Si vous avez une classe comme celle-ci: p> puis le compilateur génère l'équivalent des éléments suivants: p>
Regardez l'exemple ci-dessous, j'essaie d'expliquer ce que les
Il semble y avoir une certaine confusion concernant votre question. Voulez-vous dire comment puis-je voir les prototypes de fonction, comment puis-je voir qui sont défaillants et que j'ai mis en œuvre, ou comment puis-je voir le code pour les implémentations par défaut?