Geht folgendes, daamits inline wird, oder nicht?



  • hallo,

    Patrick und ich streiten gerade darüber, ob das hier geht:

    class C
    {
    public:
    inline void func();
    };
    
    void C::func()
    {
    }
    

    Also ich meine gehört zu haben, dass man inline-Funktionen auch implementieren kann, soweit sie in der Header-Datei stehen.
    Patrick behauptet aber, dass man inlöine-Funktionen in Klassen immer sofort in der Klasse selber implementieren müsste.

    Was ist richtig?

    MfG MAV



  • Nein, man kann inline Funktionen auch außerhalb der Klassendefinition definieren.

    Dies kenne ich aber bisher nur so:

    class C{
    void func();
    };
    
    inline void C::func()
    {
    }
    

    Also das inline bei der Definition der Funktion schreiben. Ob die Version von dir auch geht, weiß ich nicht.



  • Ach so!

    Dann hatte ich das verwechselt, gut 🙂



  • Wenn die Implementation aber nicht im Header steht, kann der Compiler sie nicht inlinen, inline hin oder her.



  • Beim VC kann man mit einigen externs was tricksen. Ob dann geinlined wird ist die Frage.



  • Wenn der Compiler bei einem Methodenaufruf den Code der Methode noch nicht gesehen hat (weil er in einer anderen Datei ist), kann er nichts inlinen. Er kennt die Größe des Codes ja gar nicht.

    Was meinst du mit extern-Tricks?



  • Also beim VC6 konnte man irgendwie (wenn ich mich richtig erinnere) eine inline-Funktion in die cpp auslagern mit extern ohne dass er meckert. Die wurde dann AFAIK nie wirklich geinlined also ->Schwachsinn.



  • inline ist ja auch nur ein Vorschlag für den Compiler.
    Beim VC++ gibts noch __forceinline. Ob das was bringt, sei dahingestellt (aber bitte nicht in diesem Forum 😉 ).



  • __forceinline ist auch nur ein ernstgemeinter Ratschlag an den Compiler. Der darf das trotzdem ignorieren. Wenn man wirklich sicher sein will, dass geinlined wird kommt man um hässliche Makros nicht rum.



  • Wenn der Compiler eine Funktion trotz __forceinline nicht inlined, ergibt das eine Stufe 1 Warnung. 🙂



  • inline hat in erster Linie semantische Bedeutung: eine inline-Funktion darf mehrmals (identisch nach der ODR) definiert werden. __forceinline ist AFAIK ein Flag, was den Optimierungsalgorithmus des VC++ in seiner Entscheidung, ob eine Funktion inline expandiert werden soll, beeinflusst.



  • Fluxx schrieb:

    Nein, man kann inline Funktionen auch außerhalb der Klassendefinition definieren.

    Dies kenne ich aber bisher nur so:

    class C{
    void func();
    };
    
    inline void C::func()
    {
    }
    

    Also das inline bei der Definition der Funktion schreiben. Ob die Version von dir auch geht, weiß ich nicht.

    Ja geht auch. Man kann inline bei der Deklaration, bei der Definition und bei beiden hinschreiben. Wichtig ist nur, dass eine Funktion nur da inline generiert werden kann (und nur da mehrfach definiert werden darf), wo der Compiler das inline gesehen hat. Und wo die Definition vorhanden ist.
    Schreibst du also das inline nur an die Definition, packst diese dann aber in eine cpp-Datei, dann ist die Funktion lediglich in dieser einen UE inline.


Anmelden zum Antworten