Klassenfunktionen immer inline?



  • Hallo,
    habe hier leider nur ein arg altes C++ Buch.
    Dort steht beschrieben, daß man in einer Klasse
    nur sehr kleine Funktionen inline definieren soll.
    Große Funktionen sollten stehts außerhalb der
    Klasse mit dem :: Operator definiert werden.
    Bsp.:

    class Test
    {
     public:
      Test()      // Construktor
      {
       vara=0;
      }
    
      void kleinefn()       // kleine fn() inline
      {
       //sehr kleine Funktion
      }
    
      void grossefn();    // prototyp der grossen fn() innerhalb der Klasse
    
     protected:
     int vara;
    }
    
    void Test::grossefn()  // grosse fn() außerhalb der Klasse definiert
    {
     //große Funktion
    }
    

    Nun meine Frage.
    In wie fern ist es noch relevant dies zu tun?
    Machen die modernen Compiler das nicht eh automatisch?
    Oder ist es aus Performancegründen wichtig,
    große Klassenfunktionen nicht inline zu definieren.

    Gruß,
    DC



  • also das mit den inline funktionen ist (übrigens auch bei c) ungefähr folgendermassen:
    wenn ich eine funktion x() inline definiere, dann wird im resultierenden binary keine funktion x() angelegt, sondern der code der funktion x() überall dort eingefügt, wo sie aufgerufen wird. wenn ich also eine kleine funktion habe, die nur ein paar mal aufgerufen wird, bracuht sie inline weniger platz als wenn ich sie nicht inline definiere. andersrum wenn ich eine riesige funktion inline definiere, wird diese riesige funktion jedes mal eingefügt anstatt einfach nur ein aufruf... das ganze schlägt sich auch irgendwie auf die performance nieder aber wie das zusammenhängt, weiss ich nich

    mal abgesehen davon sind große funktionen, die inline in der klassendeklaration stehen, ziemlich unübersichtlich

    ich hoffe ich hab jetzt hier kein stuss gelabert, is schon länger her dass ich das gelesen hab (und dazu noch inner msdn!)

    mfg



  • @fallen: inline ist nur eine Empfehlung an den Compiler.



  • :d schrieb:

    @fallen: inline ist nur eine Empfehlung an den Compiler.

    Gilt dies auch für "impliziertes" inline, also wenn die Definition in der Klassendeklaration steht?
    Bei einem explizitem ist es mir klar.

    //edit: Rechtschreibung



  • Ja das gilt immer. Manche Compiler erzeugen zb niemals inline code wenn eine for schleife vorhanden ist.
    Kurt



  • Afaik ja - wäre auch eher kontraproduktiv, wenn der Compiler jede als inline deklarierte Funktion auch inline expandieren müsste.



  • Also verstehe ich das nun richtig, daß der Compiler
    eh selbst entscheidet wie er die Funktionen ablegt und
    ich mir darüber selbst keine Gedanken mehr machen muß?
    Denn, ab wann ist denn eine Funktion zu groß für Inline?

    Gruß,
    DC



  • Don Carsto schrieb:

    Also verstehe ich das nun richtig, daß der Compiler
    eh selbst entscheidet wie er die Funktionen ablegt und
    ich mir darüber selbst keine Gedanken mehr machen muß?

    Richtig erkannt - allerdings könnte es sein, daß "inline" deklarierte Funktionen eher dafür ausgewählt werden (oder daß eine Funktion je nach Position inline UND normal verwendet werden kann).

    Denn, ab wann ist denn eine Funktion zu groß für Inline?

    Das ist die Entscheidung des Compilers - in der Regel ist der Grenzbereich erreicht, wenn der Code für die Stack-Bereitstellung und den Funktionsaufruf umfangreicher wird als die eigentliche Funktion.



  • Alles klar, nun weiß ich Bescheid..
    Danke!!


Anmelden zum Antworten