• 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:

    template <class T>
    void SetOne(T &Val)
    {
    Val= 1;
    }

    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.