Korrekte Uebergabe von const T& und T&



  • Hallo,

    ich wuerde gerne wissen, wie man vernuenftig und sicher Werte, die eine Funktion berechnet, in einem std::vector<> speichert und zurueckgibt.
    Folgendes Szenario:

    // Diese Moeglichkeit
    void foo1(const std::vector<double>& input, std::vector<double>& output)
    {
       // interpretiere input und fuege Werte an output an
    }
    // versus
    std::vector<double> foo2(const std::vector<double&> input)
    {
        std::vector<double> output;
        // interpretiere input und fuege Werte an output an
        return output;
    }
    

    Ich dachte, Version 'foo1' sei performanter als 'foo2', da keine Kopie von output angelegt werden muss.
    Nur: Wenn jemand nun 'foo1' mit zweimal dem gleichen Vektor aufruft

    std::vector<double> v;
       foo1(v,v);
    

    kann man ganz schnell in der Bredouille landen.

    Was waere nun der beste Weg fuer eine 'foo' Funktion, um so etwas zu vermeiden?
    'foo2', und man nimmt den overhead in Kauf, oder 'foo1' mit einer Modifikation, die den Selbstaufruf vermeidet?



  • Du kannst ja testen.

    void foo1(const std::vector<double>& input, std::vector<double>& output)
    {
       if( &input == &output )
       {
    // Fehlerbehandlung (Exception oder so)
       }   
    // interpretiere input und fuege Werte an output an
    }
    

Log in to reply