Frage zu Inline-Funktionen



  • Danke,

    habe jetzt was ich brauche.

    Gruß
    Olli



  • Und dazu gehört teilweise die eigenständige Definition einer Funktion als inline-Funktion wenn sie im gleichen Modul (CPP-Datei) verwendet wird.

    Ahja, habe ich mal gelesen bei meinem Compiler (gcc) --force-inline oder so.



  • Das bläht den Code bei vielen Funktionsaufrufen aber mächtig auf. Ach, so schlau wird der Compiler schon sein, dass er nicht stursinnig jede Funktion als inline deklariert !



  • Ja, in meinem Buch steht, für Funktionen die viel leisten macht das wenig Sinn weil die Binary grösser wird. Was allerdings VIEL bedeutet ....
    Ich schätze mal die Erkennung durch den Compiler ist so einfach auch nicht, kann man sich ja vorstellen auf was man alles achten muss.



  • ...ist sowieso unglaublich, wie leistungsfähig heutige Compiler sind. Ich glaub, ich zieh mir mal den Source vom gcc rein.



  • "inline" ist nicht nur ein Tip an den Compiler, sondern erlaubt auch u.A. die Definition einer Funktion in verschiedenen TUs zu wiederholen.



  • hustbaer schrieb:

    ...sondern erlaubt auch u.A. die Definition einer Funktion in verschiedenen TUs zu wiederholen.

    das war 'static'
    🙂



  • vista schrieb:

    hustbaer schrieb:

    ...sondern erlaubt auch u.A. die Definition einer Funktion in verschiedenen TUs zu wiederholen.

    das war 'static'
    🙂

    🙄
    Nein, meine ich nicht, ich meine inline.
    -> I N L I N E <-



  • vista schrieb:

    hustbaer schrieb:

    ...sondern erlaubt auch u.A. die Definition einer Funktion in verschiedenen TUs zu wiederholen.

    das war 'static'
    🙂

    Mit static forcierst du internal linkage, d.h. definierst du eine solche Funktion in mehreren ÜEs, erhälst du *mehrere* unterschiedliche Funktionen (eine pro ÜE). Inline-Funktionen haben, sofern nicht durch ein zusätzliches static ergänzt, external linkage, sie müssen zwar in jeder ÜE, in der sie aufgerufen werden, auch definiert sein, die Definitionen müssen aber tokenweise identisch sein und ergeben am Ende genau eine Definition.



  • Außerdem muß die inline-Funktion VOR dem Aufruf definiert sein, also

    inline int Double(int target) 
    { 
        return 2*target; 
    }
    
    int main() 
    { 
        int target; 
    
        cout << "Bitte eine Zahl eingeben: "; 
        cin >> target; 
        cout << "\n"; 
    
        target = Double(target); 
        cout << "Target: " << target << endl; 
    
        return 0; 
    }
    

    Denn wie soll er sonst den Code inlinen, wenn er die Definition nicht kennt?!!



  • HumeSikkins schrieb:

    vista schrieb:

    hustbaer schrieb:

    ...sondern erlaubt auch u.A. die Definition einer Funktion in verschiedenen TUs zu wiederholen.

    das war 'static'
    🙂

    Mit static forcierst du internal linkage, d.h. definierst du eine solche Funktion in mehreren ÜEs, erhälst du *mehrere* unterschiedliche Funktionen (eine pro ÜE). Inline-Funktionen haben, sofern nicht durch ein zusätzliches static ergänzt, external linkage, sie müssen zwar in jeder ÜE, in der sie aufgerufen werden, auch definiert sein, die Definitionen müssen aber tokenweise identisch sein und ergeben am Ende genau eine Definition.

    Das was er meint, ist vielleicht das Phänomen, das in Effektiv C++ beschrieben wird: wenn eine Funktion, die als inline vom Anwender deklariert wurde, aber nicht vom Compiler inline umgesetzt wird, wurde früher diese Funktion als static umdeklariert. Das wurde gemacht, damit es keine Konflikte beim zusammenlinken von ÜE gibt, wenn diese jeweils den gleichen Header eingebunden hatten. Das ist ... *blätter* ... Kapitel 33 in der 3. Auflage von Effektiv C++.



  • @viande
    Nein, ich denke du irrst und hustbaer bezieht sich eindeutig auf die ODR-Auswirkungen die inline hat. inline ändert die "once per program"-Eigenschaft, die "normale" Funktionen haben, in eine "once per translation unit"-Eigenschaft und das hat überhaupt gar nichts mit static zu tun.

    Das was er meint, ist vielleicht das Phänomen, das in Effektiv C++ beschrieben wird: wenn eine Funktion, die als inline vom Anwender deklariert wurde, aber nicht vom Compiler inline umgesetzt wird, wurde früher diese Funktion als static umdeklariert. Das wurde gemacht, damit es keine Konflikte beim zusammenlinken von ÜE gibt, wenn diese jeweils den gleichen Header eingebunden hatten.

    Richtig. In Prä-Standard-C++ Zeiten hatten inline-Funktionen internal linkage.
    Diese Zeiten sind aber nun mittlerweile gut 10 Jahre her. Problematisch waren von je her so Sachen wie statische Variablen in inline-Funktionen. Solange eine inline-Funktion internal linkage hat, muss der Linker hier nichts besonderes machen - jede ÜE erhält ihre eigene Version. external linkage zwingt den Linker hingegen dazu, dafür zu sorgen, dass es am Ende nur genau eine Version gibt.

    Aber das hat eigentlich nichts mit dem Thema zu tun - noch einmal inline und static sind orthogonal zueinander und in diesem Thema geht es um inline und in den letzten Beiträgen um die Auswirkungen dieses Schlüsselworts auf die One Definition Rule.



  • jo. genau. 🙂


Anmelden zum Antworten