Wann inline benutzen?



  • 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.



  • HumeSikkins schrieb:

    Klar. Aber vergiss nicht dass die Regel, dass die *Definition* einer inline-deklarierten Funktion am Aufrufpunkt sichtbar sein muss unabhängig von linkage gilt.

    Ah OK danke, Weltbild wieder gerade gerückt 🙂



  • @Bashar
    Mein Problem bei dem Text ist, dass inline von verschiedenen Ebenen betrachtet werden kann/muss.
    Du hast die logische Ebene wo man sich fragt, wann/warum verwendet man inline?
    Was sind die Kosten (Code-Größe, Geschwindigkeit, hohe Kopplung)? Was bringt es (Code-Größe, Geschwindigkeit)?
    Dann hast du die C++ Ebene, wo man die Bedeutung von inline aus Sicht von C++ abklappern muss (inline ist nur ein Hinweis, inline beeinflusst ODR, inline-Semantik im Vergleich zu ARM usw.)
    Schließlich hast du die technische Ebene wo man sich anschauen könnte, wie inlining funktioniert (Vergleich: Call vs. inline) und zu welchen Zeitpunkten es geschehen kann.



  • warum alles auf einmal?
    dann doch eben nur ein faq text "inline und die odr"



  • Ich behandele speziell die Bedeutung des Schlüsselworts inline, weil da IMO die meisten Unklarheiten liegen. Also hauptsächlich die "C++-Ebene", wobei man den Rest natürlich nicht völlig außer Acht lassen kann.



  • Worin hat man die Vorteile von der ARM-Variante gegenüber der jetztigen variante gesehen? Oder hat schlicht und einfach niemand dran gedacht?



  • 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.

    Auf den Beitrag von Bashar bin ich gespannt. 🙂

    HumeSikkins: Ich habe hier die 3. deutsche Auflage, es ist die 2. englische Ausgabe vom Buch. Dort steht es (noch) so, wie ich es oben geschrieben habe. Wann wird denn die 3. Auflage ungefähr herauskommen?



  • Wann wird denn die 3. Auflage ungefähr herauskommen

    Laut Scott Meyers ist "late spring" angepeilt. Ich würde also mal auf Spätsommer tippen 😉


Anmelden zum Antworten