Problem mit Call by Reference



  • camper schrieb:

    noch ein kleiner zusatz, so geht es auch:

    void Austausch(int& x, int& y)
    {
    	y ^= x;
    	x ^= y;
    	y ^= x;
    }
    

    Ist das eigentlich performanter?

    @ssm: Sollte das nicht so aussehen:

    std::swap<int>(a,b);
    

    oder gibts für int ne Spezialisierung?

    MfG SideWinder[pclex]



  • BTW: Steckt swap nicht in der algorithm?

    *komplett verwirrt bin jetzt*

    MfG SideWinder



  • beides, is im std namespace aber auch bei den algos dabei



  • leo aka qsch schrieb:

    beides, is im std namespace aber auch bei den algos dabei

    😕 "beides, ist im Haus aber auch im Wohnzimmer" passt nicht zu "Ists im Wohnzimmer oder im Esszimmer" 😉

    MfG SideWinder



  • SideWinder schrieb:

    oder gibts für int ne Spezialisierung?

    😕 wozu braucht man eine Spezialisierung für sowas???

    template<typename T>
    void swap(T &t1, T &t2)
    {
       T tmp = t1;
       t1 = t2;
       t2 = tmp;   
    }
    

    Compiler soll in der Lage sein, solche Dinge selbst zu machen. Wenn dein Compiler sowas nich kann, schmeiß ihn in Mühl 😉 !!!



  • SideWinder schrieb:

    BTW: Steckt swap nicht in der algorithm?

    bei mir in der utility



  • SideWinder schrieb:

    Ist das eigentlich performanter?

    idR nicht.
    mag ausnahmen geben, aber auf gängigen pcs mit gängigen compiler ist das idR langsamer.

    optimal geht es per xchg - aber das sind so minimale sachen, wobei man ja auch bedenken muss, wo die variablen gerade sind, so dass ein mov reicht oder so...

    man sollte nicht versuchen cleverer als der compiler zu sein.

    oder gibts für int ne Spezialisierung?

    Ne, aber ne überladung vielleicht.
    Ansonsten muss man aber trotzdem nicht den template param angeben, weil es gott sei dank eine type deduction gibt, die feststellt, dass bei
    swap(int, int)
    wohl nur
    swap<int>() gemeint sein kann

    wobei swap<int>(a,b) uU eine andere funktion als swap(a,b) (für typeof(a)==typeof(b)==int) ist.


  • Mod

    ich hatte nicht den eindruck, es ginge hier im STL sondern, sondern um das wesen von call bei reference; irgendeine funktion muss man da ja wohl benutzen.

    Shade Of Mine schrieb:

    SideWinder schrieb:

    Ist das eigentlich performanter?

    idR nicht.
    mag ausnahmen geben, aber auf gängigen pcs mit gängigen compiler ist das idR langsamer.

    optimal geht es per xchg - aber das sind so minimale sachen, wobei man ja auch bedenken muss, wo die variablen gerade sind, so dass ein mov reicht oder so...

    das ist mit vorsicht zu geniessen. ich hatte nicht behauptet, dass es mit ^= etc. schneller wäre, denn im allgemeinen ist es das tatsächlich nicht. es bleibt trotzdem allemal eine interessante alternative, und es schadet wohl nicht, so etwas schon mal gesehen zu haben. der vorteil ist, dass diese variante keine temporäre variable braucht, was dem register allokator hilft, schliesslich leidet insbesondere die x86 architektur unter chronischem registermangel.
    2. xchg ist auch so ein biest. in den fällen, in denen ^= schneller wäre, ist es die beste variante, nur gibt es eben kein c++ konstrukt dafür (ausser eben möglicherweise std::swap), aber sobald speicheroperanden im spiel sind, ist es das bei weitem langsamste.

    man sollte nicht versuchen cleverer als der compiler zu sein.

    ich kann mir nicht vorstellen, dass du meinst, was du da sagst. 😉 compiler sind grundsätzlich dumm. sie tun genau das, was man ihnen sagt.



  • compiler sind grundsätzlich dumm.

    Kommt darauf an wie du "dumm" spezifizierst. Selbst mit Inline-Assembler wirst du Standard-Cdoe meistens nur halb so gut wie dein Compiler optimieren können.

    MfG SideWinder


  • Mod

    SideWinder schrieb:

    Selbst mit Inline-Assembler wirst du Standard-Cdoe meistens nur halb so gut wie dein Compiler optimieren können.

    Kommt darauf an, was du mit "Standard-Cdoe" meinst. Bei einer hinreichend komplexen Funktion schlag ich noch jeden Compiler.


Anmelden zum Antworten