Inline-Methode in .cpp definieren



  • Hey!

    Früher wollte ich mal zwecks Übersicht auch inline-Funktionen in der .cpp definieren, obwohl man es ja in der .h machen soll(/muss?).
    Doch da hat es nicht geklappt, kam nur "unresolved external symbol".

    Nun, heut hab ich das nochmal mit VC++ Express probiert, hat komischerweise geklappt. Dachte mir cool, wurde wohl der Compiler verbessert. Aber als ich die zweite Klasse abänderte, hat es wieder den Fehler ergeben...

    1. Frage: Warum nicht schon bei der ersten Klasse? Ja, bei einer Klasse gehts, bei der nächsten nimmer...

    2. Frage: Geht das nicht iiirgendwie schöner als implizit inline (ist doch unübersichtlich) oder als Definition in der header (unschön..) ?

    A.h

    class A
    {
    public:
        A();
        ~A();
    
        void func();
    };
    

    A.cpp

    A::A()
    {
        ;
    }
    
    A::~A()
    {
        ;
    }
    
    inline void A::func()
    {
        ;
    }
    

    Also ganz normal, die zweite Klasse sieht auch ned anders aus, aber da kommt plötzlich der Fehler, wenn ich inline vor den Funktionsrumpf setze...

    MfG



  • Habe keine Lust, die 1. Frage näher zu betrachten (aber müsstest du nicht sowohl Deklaration als auch Definition inline machen? und wo ist deine 2. Klasse?), aber zur 2.: "Whole Program Optimization" auf "Use Link Time Code Generation" stellen (falls es das bei der Express gibt), dann macht der Linker den Code aus der .cpp selber inline wenn er es für sinnvoll hält.



  • Aber ich möchte doch selbst bestimmen, welche Funktionen inline und welche nicht inline sind... Ist doch wichtig.

    Die andere Klasse hab ich ned aufgeschrieben, weil die genauso aussieht.
    (Ne, bei der expliziten inline-methode muss inline nur bei der Definition angegeben werden)

    MfG



  • Wenn du die inline-Funktion nur in den nachfolgenden Funktionen benutzt, dann ist das kein Problem, aber du kannst inline-Funktionen (die nur in Source-Dateien definiert sind) nicht in anderen Übersetzungseinheiten benutzen.
    Wenn dich die inline Schreibweise stört (d.h. bei der Deklaration schon die Definition anzugeben), dann kannst du die inline-Funktionen ja z.B. in eine eigene Datei auslagern:

    // A.h
    class A
    {
    public:
        A();
        ~A();
    
        void func();
    };
    
    #include "A.inl"
    
    // A.inl
    inline void func()
    {
      cout << "Here I am!" << endl;
    }
    


  • ceplusplus@loggedoff schrieb:

    Aber ich möchte doch selbst bestimmen, welche Funktionen inline und welche nicht inline sind... Ist doch wichtig.

    Nein, das ist *nicht* wichtig. Der Compiler kann im Regelfall viel besser als du entscheiden, wo es Sinn ergibt, Methoden zu inlinen. Sinnvoll ist die explizite Angabe eigentlich nur, wenn man ansonsten die ODR verletzt (also z.B. bei Nur-Header-Bibliotheken).



  • Zusatz: Das von mir gesagte kennt natürlich Ausnahmen. Wenn man durch einen Profiler den Programmfluss analysiert hat, kann man evtl. besser als ein (statischer) Compiler bestimmen, wo Inlining Sinn ergibt. Das ist einer der großen Vorteile vor einem JIT.



  • Th schrieb:

    Wenn du die inline-Funktion nur in den nachfolgenden Funktionen benutzt, dann ist das kein Problem, aber du kannst inline-Funktionen (die nur in Source-Dateien definiert sind) nicht in anderen Übersetzungseinheiten benutzen.

    Versteh ich jetzt nicht ganz. Meinst du auch inline-Methoden?

    Konrad Rudolph schrieb:

    Der Compiler kann im Regelfall viel besser als du entscheiden, wo es Sinn ergibt, Methoden zu inlinen. Sinnvoll ist die explizite Angabe eigentlich nur, wenn man ansonsten die ODR verletzt (also z.B. bei Nur-Header-Bibliotheken).

    Aber ich möchte zB. sicherstellen, dass die Methoden welche jedes Frame aufgerufen werden (In einem Spiel), ganz sicher inline sind.

    MfG



  • ceplusplus@loggedoff schrieb:

    Aber ich möchte zB. sicherstellen, dass die Methoden welche jedes Frame aufgerufen werden (In einem Spiel), ganz sicher inline sind.

    Hier wäre es dann wohl sinnvoller, den Schalter -O3 (volle Optimierung) am Compiler anzuschalten, anstatt sich auf das Inlining zu versteifen.



  • Mhm, und damit ist sichergestellt, dass ständig aufgerufene Funktionen inline sind? Ich verwende VC++ Express 2008

    MfG



  • ceplusplus@loggedoff schrieb:

    Mhm, und damit ist sichergestellt, dass ständig aufgerufene Funktionen inline sind? Ich verwende VC++ Express 2008

    Hm, ich weiß nicht, ob der Express-Compiler ordentliche Optimierungen beinhaltet. Ansonsten gilt: prinzipiell ja, wenn die aufzurufende Funktion klein genug ist, dass es sich lohnt. Bei großen Funktionen schadet das Inlining mehr als es nutzt.



  • Konrad Rudolph hat völlig Recht.
    1. Weiss der Kompiler besser als Du was zu inlinen ist und was nicht.
    2. Profiler würden Licht ins dunkle bringen.
    3. Inlinen kann beides bewirken: Geschwindigkeitssteigerung, aber auch Verminderung.

    simon


Anmelden zum Antworten