Virutelle inline Funktionen



  • Gibt es bei virtuellen inline Funktionen (z.B. "virtual inline void Func() { */* ... / }") irgend etwas spezielles zu beachten, oder verhalten die sich genau so wie 'normale' virtuelle Funktionen?
    Oder wird dabei vielleicht sogar vom Compiler das inline ignoriert??



  • LukasBanana schrieb:

    Oder wird dabei vielleicht sogar vom Compiler das inline ignoriert??

    Ja.



  • Die Benutzung des inline Schlüsselworts macht heutzutage kaum noch Sinn... der Compiler kann wesentlich besser entscheiden, ob es Sinn macht einen Funktionsaufruf zu machen oder den inline Code zu erzeugen.



  • DocShoe schrieb:

    Die Benutzung des inline Schlüsselworts macht heutzutage kaum noch Sinn...

    Es sei denn, man definiert eine Funktion im Header, denn ohne inline würde der Linker über doppelt definierte Funktionen stolpern.

    Lars



  • Wenn der Compiler nicht weiß, welche konkrete Klasse hinter dem Objekt steckt, kann er den Aufruf natürlich nicht inlinen.

    MyDerivedClass c;
    c.inlineFunction(); // kein Problem
    
    MyBaseClass* b = new MyDerivedClass;
    b->inlineFunction(); // schon schwerer, aber machbar
    
    MyBaseClass* b2 = rätselhaftebedingung ? new MyDerivedClass : new YourDerivedClass;
    b->inlineFunction(); // kann nicht geinlinet werden
    

    Ansonsten gilt zum inline-Schlüsselwort natürlich das bisher schon gesagte.



  • Ich betrachte das inline Keyword nur als Weg um die ODR einzuhalten.
    Mehr macht doch das Keyword eigentlich auch nicht... oder irre ich mich?

    Simon



  • manni66 schrieb:

    DocShoe schrieb:

    Die Benutzung des inline Schlüsselworts macht heutzutage kaum noch Sinn...

    Es sei denn, man definiert eine Funktion im Header, denn ohne inline würde der Linker über doppelt definierte Funktionen stolpern.

    Das verstehe ich nicht! Ich dachte gerade wenn man eine Funktion im Header definiert ist das inline überflüssig?
    Ich hab zumindest einige Funktionen im Header definiert ohne ein explizietes inline und der Linker hat sich nie beschwert.

    Oder deklarierst du die Funktion erst und definierst Sie an einer anderen Stelle oder was genau ist da gemeint?



  • Jockelx schrieb:

    manni66 schrieb:

    DocShoe schrieb:

    Die Benutzung des inline Schlüsselworts macht heutzutage kaum noch Sinn...

    Es sei denn, man definiert eine Funktion im Header, denn ohne inline würde der Linker über doppelt definierte Funktionen stolpern.

    Das verstehe ich nicht! Ich dachte gerade wenn man eine Funktion im Header definiert ist das inline überflüssig?
    Ich hab zumindest einige Funktionen im Header definiert ohne ein explizietes inline und der Linker hat sich nie beschwert.

    Oder deklarierst du die Funktion erst und definierst Sie an einer anderen Stelle oder was genau ist da gemeint?

    struct x
    {
      void f1();
    };
    
    void x::f1() {}  // Fehler
    
    void f2() {} // Fehler
    

    Ohne inline führen die beiden Funktionsdefinitionen zu einem Fehler, wobei ich persönlich in einem Header die Klassenfunktion (f1) auch in der Klasse selber definieren würde. In Qt ist das aber z.B. oft so wie oben gemacht.

    Lars



  • Ah okay , hab ich noch nie gesehen und werde ich auch zukünftig in meinem Code nicht sehen 😉 .
    Aber trotzdem gut zu wissen, Danke für die Erklärung.



  • Jockelx schrieb:

    Ich hab zumindest einige Funktionen im Header definiert ohne ein explizietes inline und der Linker hat sich nie beschwert.

    Innerhalb der Klasse ist es ja automatisch inline. Aber das meinst Du sicher nicht.

    Außerhalb hast Du einfach nur Glück gehabt, daß die Datei zufällig nur von einer cpp-Datei inkludiert wurde.



  • theta schrieb:

    Ich betrachte das inline Keyword nur als Weg um die ODR einzuhalten.
    Mehr macht doch das Keyword eigentlich auch nicht... oder irre ich mich?

    Naja, das Definieren im Header ermöglicht es dem Compiler, auch alten und Dummen, es zu inlinen. Es kommt vor, daß ich kleine Sachen, die ich gerne geinlined hätte, im Header definiere.

    Und dann muß man wegen der ODR inline schreiben. Aber ich schreibe nicht inline, um inlining zu bekommen.



  • volkard schrieb:

    Jockelx schrieb:

    Ich hab zumindest einige Funktionen im Header definiert ohne ein explizietes inline und der Linker hat sich nie beschwert.

    Innerhalb der Klasse ist es ja automatisch inline. Aber das meinst Du sicher nicht.

    Doch, das meinte ich.
    Ich kenne das nicht und sehe auch keinen Sinn darin, das man Funktionen ausserhalb der Klasse im Header definiert.
    Finde ich hässlich.


  • Mod

    volkard schrieb:

    Naja, das Definieren im Header ermöglicht es dem Compiler, auch alten und Dummen, es zu inlinen. Es kommt vor, daß ich kleine Sachen, die ich gerne geinlined hätte, im Header definiere.

    Und dann muß man wegen der ODR inline schreiben. Aber ich schreibe nicht inline, um inlining zu bekommen.

    😕


Anmelden zum Antworten