0
votes

Le compilateur créera-t-il vtable indépendamment de la création d'objet en c ++

class B 
{ 

public: virtual void fun1() {} 

};

class D: public B 
{ 

public: virtual void fun1() {} 

};

int main() 
{ 

//Empty Main. 

//Not creating any object of B or D. 

return 0; 

}
In GCC or Visual Studio, will the compiler create any vTable here?As per my understanding it should not create any vTables because we didn't create any B or C obj. So no need to create I think.Am I correct?

2 commentaires

Cela dépend vraiment de la mise en œuvre. Si vous voulez une déclaration universelle de ce qui devrait être vrai, alors vous serez déçu - il n'y a aucune exigence générale qu'un compilateur crée, ou ne crée pas, des vtables compte tenu de votre code.


Demandez-vous au POV d'optimiser la taille du code?


3 Réponses :


1
votes

Lors de l'utilisation de gcc, une vtable est émise (créée) dans l'unité de traduction qui définit le premier méthode virtuelle non en ligne, mais pas virtuelle pure de la classe . Cela ne dépend pas de la création ou non d'objets de cette classe. (Dans votre exemple, il n'y a pas de telles fonctions. Cependant, cela ne semble pas être le but de votre question, je vais donc l'ignorer.)

L'éditeur de liens est cependant libre de supprimer tout ce qu'il peut prouver qu'il n'est pas utilisé. Il est donc possible que la vtable ne soit pas présente dans votre exécutable final, même si le compilateur l'a créée.


0 commentaires

1
votes

J'ai essayé de voir la sortie de l'assembly du C ++ compilé sur https://godbolt.org/ avec le compilateur sous x86-64 gcc9.2

Cas 1: lien: https://godbolt.org/z/jFkC4Q

D::fun1():
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        nop
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        mov     eax, OFFSET FLAT:vtable for D+16
        mov     QWORD PTR [rbp-8], rax
        mov     eax, 0
        pop     rbp
        ret
vtable for D:
        .quad   0
        .quad   typeinfo for D
        .quad   D::fun1()
typeinfo for D:
        .quad   vtable for __cxxabiv1::__si_class_type_info+16
        .quad   typeinfo name for D
        .quad   typeinfo for B
typeinfo name for D:
        .string "1D"
typeinfo for B:
        .quad   vtable for __cxxabiv1::__class_type_info+16
        .quad   typeinfo name for B
typeinfo name for B:
        .string "1B"


1 commentaires

Notez cependant que gcc n'émet pas la vtable si vous activez les optimisations avec par ex. -O2 dans les deux cas, car ce n'est pas réellement nécessaire.



0
votes

Les tables virtuelles sont des données statiques, un peu comme un tableau constant. Il y en a une par classe polymorphe (simple). (Les classes complexes peuvent avoir de nombreuses vtables, mais c'est un détail.)

Comme tout autre symbole, il peut être référencé par code. Si vous ne créez aucune instance d'une classe, elle ne sera pas nécessaire, mais elle sera référencée par les constructeurs de votre classe (mais ces constructeurs seront des symboles non référencés).

L'éditeur de liens peut supprimer des symboles inutiles.


0 commentaires