Struktura Objektu

Struktura objektu a dědičnost

Poznamka: UpCast na obrazku znamena DownCast v textu.

Operace

void **Optr;

// Pristup k promenne
*(Type*)(Optr[Offset]) // Offset: konstanta urcena behem kompilace
                       // zavisly na typu objektu Optr a jmene promenne.

// Up cast
Optr2 = Optr + Offset; // Offset zavisi na aktualnim typu a novem typu. Novy typ musi byt predek aktualniho typu.

// Up cast na CObject
// zadna akce

// Pristup do systemove oblasti objektu
(Type*)(*Optr - Konstanta)  // Vyuzivam toho, ze Optr vzdy ukazuje na StartPtr

// Down cast
// Prectu pointr pDownCast na DownCast tabulku ze Systemove oblasti
pDownCast = (Type*)(*Optr - Konstanta);
Optr2 = (void**)(*OPtr) + pDownCast[OffsetNovehoTypu];

DownCast

Pri DownCastu kompilator nemuze overit, zda pretypovani bude uspesne. Je treba si zjistit skutecny typ objektu a pote overit, zda pretypovavam na nej nebo na nektereho jeho predka. V tom pripade ziskam Offset o ktery posunu vstupni bod do objektu proti StartPtr a pretypovani provedu. V opacnem propade ziskam -1 a vysledkem pretypovani bude null

  • Mohu vyrobit obrovskou tabulku vsechny objekty x vsechny objekty a do ni ulozit offsety a -1 pro neplatne kombinace. (viz priklad vyse) Velka pametova narocnost (Krkal nyni obsahuje asi 120 objektu). Velka rychlost DownCastu
  • Vyhledavat podtypy zakladniho typu v nejake vyhledavaci strukture (hash, strom). Podstatne pomalejsi nez jeden pristup do pole, ale pametova narocnost je zanedbatelna.
  • Vyuzit podobnou PHT tabulku, jaka se pouziva pro safe volani
  • Jine reseni???

Kontroly null pointeru

  • Pristup k promenne pres null -> vyvolat chybu
  • UpCast null -> null
  • Pristup pres null do systemove casti -> vrati null
  • DownCast bude null, pokud OPtr byl null, nebo se z DownCast tabulky precte -1 (pretypovat nelze)

Kontrolovat nulovost muzu ruzne:

  • ifem
  • chytanim vyjimek
  • nejakym dabelskym vyrazem, ktery usetri podminene skoky:
    Optr2 = (Optr + Offset) & (!Optr - 1)
    //   !0 = 1          1-1 = 0
    //   !cislo = 0      0-1 = 0xFFFF
    

Dalsi operace

  • Presun/kopie objektu - Ke vsem pointrum v pointrove casti se pricte (stejna!) konstanta. Vsechny pointry jsou hezky u sebe, coz tuto operaci usnadnuje
  • Konstrukce:
    • Alokace
    • Nastaveni systemove casti a konstrukce tridy CKerObject
    • Nastaveni ptr casti
    • zapsani defaultnich hodnot do promennych
    • zavolani kopnstruktoru

CKerObjectT - Popisuje typ

Tata trida bude mimo jine obsahovat:

  • Popis pointrove oblasti
  • velikost pointrove oblasti
  • celkova velikost objektu
  • KSID jmeno
  • Ptr na DownCast tabulku
  • pole s popisem promennych
    • typ
    • offsety do datove casti
    • defaultni hodnoty

Attachments