Inline Methoden - gut oder schlecht? Wer optimiert wie?



  • A.h:

    class A
    {
    public:
        A();
        ~A();
        int getInline() const { return var; }
        int getNotInline() const;
    protected:
    private:
        int var;
    };
    

    A.cpp

    A::A
    {
    }
    A::~A
    {
    }
    
    int A::getNotInline() const
    {
        return var;
    }
    

    Ich habe letztens mit einem Kollegen diskutiert und er war der Meinung, dass kein Compiler Inline-Funktionen optimiert, entsprechend es "performancetechnisch" keinen Unterschied macht, ob man Funktionen inline programmiert oder nicht. Weiss jemand genaueres? Würde mich sowohl für VC6 als auch für g++ unter Linux interessieren.

    Ostergrüße,
    ConstRef



  • ConstRef schrieb:

    Ich habe letztens mit einem Kollegen diskutiert und er war der Meinung, dass kein Compiler Inline-Funktionen optimiert, entsprechend es "performancetechnisch" keinen Unterschied macht, ob man Funktionen inline programmiert oder nicht.

    lol



  • Auf http://www.uni-koeln.de/rrzk/kurse/unterlagen/CPPKURS/HTML/inline.htm steht:

    *"Virtuelle Methoden kann man nicht per inline-Deklaration optimieren.
    Sie sorgt bei kurzen Funktionen häufig für kürzeren und schnelleren Code.
    Der Compiler erzeugt bei inline-Funktionen keinen Funktionsaufruf, sondern setzt den Binärcode des Funktionskörpers direkt in die aufrufende Funktion an die Stelle des Aufrufs ein.
    Das führt dann zu weniger Code, wenn der Funktionskörper kürzer ist als der Code von Funktionsaufruf und Rücksprung aus der Funktion.
    Der Code für Aufruf und Rücksprung hat schon eine gewisse Länge, insbesondere bei Parameterübergabe.
    Dabei muß man berücksichtigen, daß bei Memberfunktionen stets der this-Parameter übergeben wird.
    Außerdem kann der Compiler bei Verwendung von inline-Funktionen die Verwaltung der Register des Prozessors, auf denen die unmittelbar gebrauchten Adressen z.B. lokaler Variabler gehalten werden, besser optimieren.

    Als Daumenregel kann man sagen, daß Funktionen mit ein bis drei Wertzuweisungen sich sicher als inline-Funktionen eignen."*



  • rule of thumb == Faustregel
    scnr



  • Natürlich inlinen Compiler. Aber bei einem modernen Compiler kann es gut vorkommen, dass er Funktionen inlined die du gar nicht zum inlinen vorgeschlagen hast und Funktionen nicht inlined, die du inlinen wolltest. Die Optimierer sind da nämlich ziemlich klever geworden.

    Virtuelle Funktionen können unter bestimmten Funktionen auch geinlined werden.



  • ConstRef schrieb:

    A.h:

    class A
    {
    public:
        A();
        ~A();
        int getInline() const { return var; }
        int getNotInline() const;
    protected:
    private:
        int var;
    };
    

    A.cpp

    A::A
    {
    }
    A::~A
    {
    }
    
    int A::getNotInline() const
    {
        return var;
    }
    

    Ich habe letztens mit einem Kollegen diskutiert und er war der Meinung, dass kein Compiler Inline-Funktionen optimiert, entsprechend es "performancetechnisch" keinen Unterschied macht, ob man Funktionen inline programmiert oder nicht. Weiss jemand genaueres? Würde mich sowohl für VC6 als auch für g++ unter Linux interessieren.

    Ostergrüße,
    ConstRef

    Die beiden Methoden sind doch genau gleich, nur dass eine in der Klassendeklaration und die andere außerhalb definiert werden.

    Wenn ich relativ kurze Methoden schreibe, die z.B. nur eine Klassenvariable zurückgeben, dann benutze ich sogar explizit inline (k.A. wieso ich mir das angewöhnt habe):

    inline uint32 GetLength () const { return this->uLength; }
    inline uint32 GetSize   () const { return this->uSize; }
    inline bool   IsEmpty   () const { return !this->uLength; }
    
    inline bool operator !     () const { return !(bool)*this; }
    inline      operator bool  () const { return (this->GetLength() != 0); }
    inline      operator char* () const { return this->cString; }
    

Log in to reply