2008-12-27 9 views

Répondre

0

Oui, mais vous ne l'aimerez pas beaucoup. Ce que vous devez faire est d'utiliser l'option -S (sur gcc, vérifiez votre documentation pour les autres compilateurs) et de générer le code assembleur, puis lisez-le.

6

Je ne sais pas exactement ce que vous voulez savoir. Pour cet exemple simple

class classA { }; 

class classB { }; 

class classC : public classA, public classB { 

}; 

$ g++ -fdump-class-hierarchy test.cpp 

produit les éléments suivants dans un fichier test.cpp.002t.class

Class classA 
    size=1 align=1 
    base size=0 base align=1 
classA (0xb7b06780) 0 empty 

Class classB 
    size=1 align=1 
    base size=0 base align=1 
classB (0xb7b067bc) 0 empty 

Class classC 
    size=1 align=1 
    base size=1 base align=1 
classC (0xb7a736e0) 0 empty 
    classA (0xb7b067f8) 0 empty 
    classB (0xb7b06834) 0 empty 

Voir la page gcc pour plus de détails. Changement CLASSA à ceci:

class classA { int aObj; virtual void aFun() { } }; 

pops Soudain une table virtuelle:

Vtable for classA 
classA::_ZTV6classA: 3u entries 
0  (int (*)(...))0 
4  (int (*)(...))(& _ZTI6classA) 
8  classA::aFun 

Class classA 
    size=8 align=4 
    base size=8 base align=4 
classA (0xb7b4d7f8) 0 
    vptr=((& classA::_ZTV6classA) + 8u) 

Class classB 
    size=1 align=1 
    base size=0 base align=1 
classB (0xb7b4d9d8) 0 empty 

Vtable for classC 
classC::_ZTV6classC: 3u entries 
0  (int (*)(...))0 
4  (int (*)(...))(& _ZTI6classC) 
8  classA::aFun 

Class classC 
    size=8 align=4 
    base size=8 base align=4 
classC (0xb7aba820) 0 
    vptr=((& classC::_ZTV6classC) + 8u) 
    classA (0xb7b4da14) 0 
     primary-for classC (0xb7aba820) 
    classB (0xb7b4da50) 0 empty 

Ce qui a l'air si étrange (_ZTI6classA et _ZTI6classC et _ZTV6classC) est en fait un pointeur sur le gcc d'information RTTI créé pour les classes . L'utilisation de -fno-rtti montre qu'il affectera alors un pointeur NULL aux deuxièmes entrées des vtables. Nice, amusez-vous à creuser dans ces informations.

+0

D'accord, c'est cool. –

Questions connexes