1 / 52

C++ internals

C++ internals. ou comprendre le C++ Par Thomas Sanchez Et Lionel Auroux. C ++ internals / Plan. La Surcharge Les namespaces Fonctions membres Héritage simple/multiple Méthodes dans un héritage simple/multiple Héritage base virtuelle Pointeur sur membre.

Download Presentation

C++ internals

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++ internals ou comprendre le C++ Par Thomas Sanchez Et Lionel Auroux

  2. C ++ internals / Plan La Surcharge Les namespaces Fonctions membres Héritage simple/multiple Méthodes dans un héritage simple/multiple Héritage base virtuelle Pointeur sur membre

  3. Rappel en assembleur et calling convention x64 %registre $const X(%reg) == *(%reg + X) (%reg, X, Y) == *(reg + (X * Y)) mov %src, %dest mov{b,l,q} == mov byte (1octet), long (4 octets), quad-word (8 octets)

  4. Rappel en assembleur et calling convention x64 • Registres: R{A,B,C,D}X, RDI, RSI, RBP, RSP, R8..15. • Si <= 6 paramètres: RDI, RSI, RDX, RCX, R8, R9. • Sinon paramètres poussés sur la pile

  5. La surcharge my_putchar(char) my_strlen(char*) my_strcmp(char*, char*) my_strcmp(string, string)

  6. La surcharge my_putchar my_strlen my_strcmp my_strcmp ELF

  7. La surcharge _Z10my_putcharc _Z9my_strlenPc _Z9my_strcmpPcS_ _Z9my_strcmpRKSsS0_ ELF

  8. Les namespaces _ZN9Namespace10my_putcharc _ZN9Namespace9my_strlenPc _ZN9Namespace9my_strcmpPcS_ _ZN9Namespace9my_strcmpRKSsS0_

  9. Les fonctions membres inst.my_memberfunc(123) ; my_memberfunc(int param) this == &inst; *(int*)this == 123; this->p = param;

  10. D’où vient le this ? Les fonctions membres struct Test { void test() {} }; int main() { Test t; t.test(); } Test t; t.test(); lea -0x1(%rbp),%rax mov %rax,%rdi callq 4008f4 <Test::test()>

  11. Héritage simple Mère Fille

  12. Héritage simple Fille Attributs Mère Mère Attributs Fille

  13. Héritage simple Attributs Mère Attributs Fille Fille *inst = new Fille() ; inst == (Mere*)inst ;

  14. Héritage multiple Mère Père Fille

  15. Héritage multiple Mère Père Fille

  16. Problématique d’accès Comment accéder aux données de Père ?

  17. Problématique d’accès Mere* inst = new Fille; inst == dynamic_cast<Fille*>(inst); inst != dynamic_cast<Pere*>(inst);

  18. Problématique d’accès Mère Méthode dans Mère Père Méthode dans Père Méthode dans Fille Fille

  19. Problématique d’accès Un accès à une méthode de Père

  20. Problématique d’accès Un accès à une méthode dans la seconde branche de l’héritage = recalcul d’adresse !

  21. Héritage en diamant GrandMère Mère Père Fille

  22. Héritage en diamant GrandMère GrandMère Mère Père Fille

  23. Héritage en diamant GrandMère Mère GrandMère Père Fille

  24. ou comment ça devient compliqué… LE VIRTUAL

  25. Surcharge d'une fonction membre virtuelle dit « méthode » Mère virtual int meth(); Fille virtual int meth(); Fille* f = new Fille; Mere* m = new Fille; f->meth(); m->meth();

  26. Surcharge de méthode Mère virtual int meth(); Virtual Table de Mère … [idx Mere::meth] Mere::meth

  27. Surcharge de méthode Mère virtual int meth(); Virtual Table de Fille … Fille virtual int meth(); Mere::meth [idx Mere::meth] Fille::meth

  28. Héritage simple Virtual Table de Fille VPTR Fille::meth Mère … Fille

  29. Remarque intptr_t** vtable = *(intptr_t***)new Fille;

  30. Héritage multiple Mère Père virtual int meth(); virtual int toto(); Fille virtual int meth(); virtual int toto();

  31. Héritage multiple Virtual Table de Fille Mère virtual int meth(); Père virtual int toto(); Virtual Table de Père dans Fille Fille virtual int meth(); virtual int toto(); [idx Mere::meth] Mere::meth [idx Pere::toto] Pere:toto [idx Pere::toto] Pere::toto

  32. Héritage multiple Virtual Table de Fille Mère virtual int meth(); Père virtual int toto(); Virtual Table de Père dans Fille Fille virtual int meth(); virtual int toto(); [idx Mere::meth] Fille::meth [idx Pere::toto] Fille:toto [idx Pere::toto] Fille::toto

  33. Héritage multiple VPTR Virtual Table de Fille Mère VPTR Virtual Table de Pere hérité dans Fille Père Fille

  34. Les préfixes de VTable VTable Préfixe Décalage vers classe concrète Instance typeinfo Virtual Table Pointeurs ptr1 ptr1 ptr2 ptr2 … … VPTR

  35. Remarque intptr_t** vtable = *(intptr_t***)new Fille; intptr_t* typeinfo_ptr = vtable[-1]; size_t offset = (size_t) vtable[-2]; Voir: gcc-src/libstdc++-v3/libsupc++/tinfo.h

  36. Héritage multiple VPTR Mère VPTR2 Père Fille Décalage dans la 2ème VTable

  37. Thunk function Mère Père virtual int meth(); virtual int toto(); Fille virtual int meth(); virtual int toto();

  38. Thunk function Pere* p = new Fille; p->toto();

  39. Thunk function Mère virtual int meth(); VTable de Père Dans Fille Père Fille::toto virtual int toto(); Fille virtual int meth(); virtual int toto(); VTable de Fille

  40. Thunk function Mère virtual int meth(); VTable de Père Dans Fille thunk… Père Fille::toto Aligne this virtual int toto(); jump Fille::toto Fille virtual int meth(); virtual int toto(); VTable de Fille thunk_func_pere_to_fille

  41. Héritage en diamant GrandMère Mère Père Fille

  42. Héritage en diamant GrandMère GrandMère VIRTUAL Mère Père Fille

  43. Héritage en diamant VPTR VPTR GrandMère Mère Mère VPTR Père VPTR Fille GrandMère VPTR Père GrandMère Fille

  44. Héritage en diamant Vtable de GrandMere Préfixe Pointeurs Décalage vers 2 Décalage vers 1

  45. Héritage en diamant VPTR Mère VPTR Père Fille VPTR GrandMère Décalage vers 1 Décalage vers 2

  46. Pointeur sur membre Pointeur sur membre = 16octets

  47. Pointeur sur membre

  48. Pointeur sur membre Index dans la VTable 1 0 Adresse de la fonction membre

  49. Pointeur sur membre Aligne “this” Index dans la VTable 1 0 Adresse de la fonction membre Aligne “this”

  50. Questions

More Related