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...