Struktura Objektu
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
- strukturaObjektu.png (37.9 kB) -
Struktura objektu a dědičnost
, added by pal on 01/29/07 14:55:41.

