Wann inline benutzen?



  • das heisst alles was klein und fein ist und vor allem oft gebraucht wird wird inline gemacht



  • vertraue deinem compiler und lass ihn werkeln. inline explizit hinschreiben tut man selten.
    manchmal ist es ganz nützlich für sowas:

    //foo.cpp
    void foo () 
    {
    }
    //bar.cpp
    void foo ()
    {
    }
    

    das zusammenzulinken wird dir kaum gelingen.
    wenn foo allerdings inline wäre - kein problem.



  • davie schrieb:

    manchmal ist es ganz nützlich für sowas:

    //foo.cpp
    void foo () 
    {
    }
    //bar.cpp
    void foo ()
    {
    }
    

    das zusammenzulinken wird dir kaum gelingen.
    wenn foo allerdings inline wäre - kein problem.

    Verstehe ich nicht. Das sind doch zwei Funktionen in verschiedenen Einheiten. Was wäre jetzt mit inline besonders?



  • Da hat die FAQ anscheinend Nachholbedarf. Gibts da schon einen passenden Text zu, oder soll ich einen schreiben?



  • Nicht, dass ich wüsste, Bashar. 🙂
    Habe ein wenig gegoogelt und weiß jetzt, was du meinst.



  • Inline ist z.B. sinnvoll, wenn eine Funktion nichts anderes macht als eine Membervariable der Klasse zurückgeben.
    In normalen Programmen egal, bei der Spieleprogrammierung kann das aber wichtig sein.

    Aber wie davie gesagt hat: Sofern du einen Compiler hast der optimiert (das tun praktisch alle, eine Ausnahme ist der Compiler der Visual C++ 6 Autorenversion), müsste der das für dich machen.



  • das ist genau der den ich habe 😞



  • Ist doch völlig wurscht.

    Wenn du unbedingt so geil drauf bist, dann update ihn mit Visual C++ Toolkit 2003.



  • ich hatte da auch nachholbedarf bezüglich inline..wartet auf Bashars faq-text und höret und staunet 😉



  • man lernt doch nie aus.



  • Bashar schrieb:

    Da hat die FAQ anscheinend Nachholbedarf. Gibts da schon einen passenden Text zu, oder soll ich einen schreiben?

    Wäre schön wenn du was dazu schreibst.

    Ich habe hier zwar auch noch einen 7-Seiten Draft-Text zum Thema rumliegen, aber der wird sowieso nie fertig (liegt schon seit fast einem Jahr auf meiner Festplatte rum).



  • Facer schrieb:

    das heisst alles was klein und fein ist und vor allem oft gebraucht wird wird inline gemacht

    war's nicht so dass der compiler stillschweigend nicht 'inlined' wenn's ihm nicht in den kram passt? man kann auch ein #define nehmen. das wird immer 'ge-inlined'. templates ja auch.



  • Wenn der Compiler sich deinem inline widersetzt, dann weiß er schon, warum. Es ist sicher keine Alternative ein Makro zu nehmen.



  • Optimizer schrieb:

    Wenn der Compiler sich deinem inline widersetzt, dann weiß er schon, warum.

    das kann er ja schon ablehnen wenn die signatur bzw. parameterliste usw. ihm nicht passen, unabhängig vom 'body' der funktion. oder sehe ich das falsch?



  • Ich meine keine Compilerfehler, sondern, dass er eine Funktion nicht inlined, wovon du ja geredet hast.



  • In Effektiv C++ programmieren von Scott Meyers steht ein guter Text über inline und seine Gefahren (Richtlinie 33). Dort wird auch gesagt, dass alle Funktionen, die der Compiler als nicht inline akzeptiert, automatisch static werden. (Sie sind nur in der einen ÜE verfügbar). Das ist auch der Grund, warum man Templatemethoden in der Header als inline definiert, so dass es keine doppelte Definitionen der Methoden gibt. (Schlussendlich ein Linker-Fehler) Dass die Methoden als static deklariert wurden, hat natürlich auch seine Nachteile. Das liest man aber am besten bei Interesse im Buch selber nach.



  • ChrissiB schrieb:

    In Effektiv C++ programmieren von Scott Meyers steht ein guter Text über inline und seine Gefahren (Richtlinie 33). Dort wird auch gesagt, dass alle Funktionen, die der Compiler als nicht inline akzeptiert, automatisch static werden.

    Das ist käse. inline-Funktionen sind, sofern nicht anders deklariert, extern, haben also external-linkage. Es ist Aufgabe des Compilers dafür zu sorgen, dass es nur genau eine Instanz der Funktion gibt, falls die inline-Funktion nicht inline generiert wird oder deren Adresse gebildet wird.
    Wenn Meyers das dort wirklich so schreibt, dann gilt das nur für Prä-Standard-C++ nicht aber für das C++ was wir kennen.



  • Update: Ich habe gerade in mein "Effective C++ - Second Edition 11th Printing" reingeschaut und da weißt Meyers korrekterweise darauf hin, dass das was du da oben schreibst nur für die "old outlined inline rules" gilt (sprich für ARM-C++).
    Du solltest also mal über die Neuanschaffung einer neuen Version des Buches nachdenken. Aber warte noch ein bischen: Meyers schreibt gerade an einer dritten Ausgabe.



  • Hume, ich habe bisher auch nur einen Entwurf von vor 2 Tagen, und seitdem nicht viel dran gemacht. Der ist soweit noch nicht ganz korrekt (ich wußte nicht dass inline-Funktionene external Linkage haben -- heißt das nicht, ich kann generell jede Funktion inline deklarieren? Ich dachte immer das wär bei solchen in anderen ÜEs keine gute Idee) und didaktisch muss er auch nochmal überholt werden.



  • Bashar schrieb:

    (ich wußte nicht dass inline-Funktionene external Linkage haben -- heißt das nicht, ich kann generell jede Funktion inline deklarieren?

    Klar. Aber vergiss nicht dass die Regel, dass die *Definition* einer inline-deklarierten Funktion am Aufrufpunkt sichtbar sein muss unabhängig von linkage gilt.
    D.h. wenn du eine Funktion inline-deklarierst, die Definition aber in ÜE1 hast und du dann diese Funktion in ÜE2 aufrufst, dann hast du undefiniertes Verhalten.

    Das Wichtigste was sich durch die Umstellung auf external-linkage geändert hat, ist die Tatsache, dass Funkions-statische Objekte nur einmal pro Programm und nicht einmal pro ÜE existieren.


Anmelden zum Antworten