alt3r3g0#63
Nem írtál konkrétumokat, így vegyük sorra:
member függvény hívások: ez csak egyszerű szintaktikai különbség, ha c++-ben ezt irod:
object.function();
a hívás assembly-ben már ugyanaz, mintha c-ben ezt irnád:
function(Object* this);
virtuális függvények:
Ennek mint írtam van kis overheadje, de nem igazán létezik effektívebb módszer, kivéve speciális esetekben, nagyjából így működik:
ugye egy class ami tartalmaz virtuális függvényt annak van egy utolsó nem látható membere, egy pointer a virtuális függvényeinek címét tartalmazó táblára. Tehat egy kétszeres indirekción keresztül (csak memóriaolvasás) történik, az nem egy vészes dolog. Egy hagyományos - tehát nem inlineolt függvényhez képest - a cache találat a leglényegesebb tényező, mind code, mind adat cache részéről. Magyarán, ha egy függvény nem inlineolt, és az ugrótábla benne van az adat cache-ben, akkor nagyon minimális a plusz művelet amit igényel, ha érdekel azt is kirészletezhetem, hogy milyen alternatíváid lehetnének, de egy másik hozzászólásban, így is túl hosszú leszek...
template-ek: ezekkel egy függvény-t class-t tudsz sokféle típusra legyártani, de ez sebességben nem jelent overhead-et, mivel külön külön legyártja őket az összes használt típusra, egy egyszerű nem túl gyakorlatias példa:
függvény esetén ha használod int-el és float-al, akkor legyártódik 2 féle verzió, így pont ugyanaz, mintha te írtad volna meg őket mindkét típusra. Természetesen ezt bármly normális fordító ki-inlineolja, és gépi kódban már nem lesz semmiféle függvényhívásod, egyszerűen egy memóriacímbe, vagy regiszterbe tölti direkt módon az int vagy float 1-et.