HTML

gondolataim elsősorban játékfejlesztésről

Elsősorban játékfejlesztés magyarul: az enginem fejlesztése során felmerülő problémák, ötletek, tévutak stb dokumentálása, amely számomra és talán mások számára is hasznos lehet később Másodsorban gondolatok szavakban...

Kapcsolat:
aalberik 'at' gmail 'dot' com

Haletető

Galéria

Címkék

Összes

Linkblog

Naptár

május 2024
Hét Ked Sze Csü Pén Szo Vas
<<  < Archív
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

ó te drága öröklődés

2009.05.28. 20:52 :: syam

Minap elmélyedtem/elsüllyedtem ismét az osztály függvények rejtelmeiben és ismét találkoztam a c++ fordítók titkaival.

Az oop szellemében minden osztályt és azok lehetséges kapcsolatotait és működésüket előre megtervezve viszonylag sokszor előkerül az öröklés és azon belül a virtuális függvények. Arról általában felvilágosítják az embereket, hogy ezek a virtuális függvények valójában függvénypointerek azt már kevésbé reklámozzák, hogy ezen függvények hívását számos lépés előzi meg, amelyet a fordító teljesen elrejt előlünk.

A legtöbb programozónak a pointerek (32 bites rendszeren védett módban) 4 byte hosszú típust juttatnak az eszébe, amely egy memóriadeszkriptort jelent. Ez egyaránt igaz az adat és függvénypointerekre is. Azonban ha lekérdezzük egy osztály egyik függvényének címét, akkor "bonyolultságtól" és fordítótól függően nem a várt 4-t kapunk.

Ennek oka az, hogy a fordítók eltérő módon kezelik az ilyen függvényeket és a rájuk mutató pointert kissé átértelmezik oly módon, hogy a valós címük helyütt azt egy 4-20 byte hosszuságú strukturáként tárolják, amely egyéb adatokat is tartalmazhat (ilyen pl. a this pointer).

Ez még önmagában nem jelentene tulzott bonyodalmat, hanem a fordítók különböző címszámításokat és feltételeket hajtanak végre mielőtt egyáltalán a függvényhívásra kerülne a sor. Így tehát jó pár órajelet elveszthetünk eme apróság miatt, amely sebességkritikus helyeknél igencsak értelmetlen veszteség.

Amennyiben függvénypointereket akarunk létrehozni és azoknak értéket adni, kaphatunk némi bónuszt is miszerint bizonyos fordítóknál az értékadás nem fog lefutni az eltérő pointerek miatt. Ez leginkább msvc alatt jelentkezik, ahol a /vmg kapcsolóval elérhetjük, hogy minden függvénypointer ugyanolyan méretű legyen elkerülve a kompatibilitási hibákat.

Szóval csak óvatosan az öröklődéssel...

 

Szólj hozzá!

A bejegyzés trackback címe:

https://sakura7.blog.hu/api/trackback/id/tr471149744

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása