Habe frage



  • Optimizer schrieb:

    Was geinlined wird, bestimmt der Compiler und den interressiert des keinen Meter, wenn du da inline hinschreibst. :p

    wär ich mir nicht so sicher. unter umständen reagiert der compiler schon auf ein inline, wenn es bei einer funktion steht die er sonst nicht geinlined hätte. ich mag mich noch an ein programm von mir erinnern bei dem ich in nem sortieralgo ein bisschen mit inlines herumgespielt habe und festellen musste, dass es mit inline langsamer war als ohne. da muss sich also was getan haben. das es langsamer war lag vielleicht daran, dass die funktionen dann zu aufgeblasen wurden und nimmer in ein cash gepasst haben oder so.



  • ah danke 🙂 dann teste ich demnächst nur noch im Releasemode, wenn inline überflüssig ist, wieso gibt es dann inline und vorallem was ist __forceinline?



  • japro schrieb:

    Optimizer schrieb:

    Was geinlined wird, bestimmt der Compiler und den interressiert des keinen Meter, wenn du da inline hinschreibst. :p

    wär ich mir nicht so sicher. unter umständen reagiert der compiler schon auf ein inline, wenn es bei einer funktion steht die er sonst nicht geinlined hätte. ich mag mich noch an ein programm von mir erinnern bei dem ich in nem sortieralgo ein bisschen mit inlines herumgespielt habe und festellen musste, dass es mit inline langsamer war als ohne. da muss sich also was getan haben. das es langsamer war lag vielleicht daran, dass die funktionen dann zu aufgeblasen wurden und nimmer in ein cash gepasst haben oder so.

    Lauft MSDN gibt es einen "slight Bonus" beim inlinen beim VC++. Aber ich persönlich habe noch nie einen Unterschied bewirken können. Und ich denke mal, der Compiler macht das schon besser als ich (dürfte dein Beispiel ja auch zeigen).

    __forceinline gibt einen größeren Bonus (also ne höhere Wahrscheinlichkeit, dass die Funktion geinlined wird). Würde ich absolut nicht verwenden, außer du weisst es besser, wie der Compiler. :p



  • inline hat einen nachteil: es wird mehr code erzeugt.
    folglich läuft eine binary mit nur inline wesentlich langsamer als eine binary mit optimalen inlines.

    und wer kann die funktionen optimal inlinen? der compiler.



  • foobar schrieb:

    wieso gibt es dann inline

    Von templates mal abgesehen: Funktionen, die nicht inline sind, dürfen nur an einer einzigen Stelle im Programm definiert sein. Wenn man aber inline davor schreibt, dürfen sie auch öfter vorkommen (dadurch, dass sie in einem mehrfach inkludierten Header stehen z.B.).
    Das heißt, dass inline es erst ermöglicht, Funktionen in Headerdateien zu schreiben und sie dadurch dem Compiler fürs Inlinen zugänglich zu machen. Wenn man Funktionen innerhalb der Klassendefinition gleich definiert (in deinem Fall getWidth und getHeight in der Definition von CScreen), sind sie aber sowieso automatisch inline. Deshalb braucht man das Schlüsselwort 'inline' an sich dann doch nicht *so* oft. Ich jedenfalls nicht 😉

    Unter "One Definition Rule" findest du sicher eine etwas präzisere Erklärung...



  • und sie dadurch dem Compiler fürs Inlinen zugänglich zu machen.

    Jain. 😉
    Theoretisch ist es so natürlich richtig, aber heutige Compiler inlinen "normal definierte Funktionen" genauso, wenn sie es für geeignet halten. Ich persönlich rate i.A. von der Verwendung von inline ab, das hat nur den Nachteil, dass 50 Dateien neu kompiliert werden müssen, wenn man was an ner Header ändert und es macht sowieso praktisch keinen Unterschied.

    i.d.R.:
    Debug-Build: Nichts wird geinlined.
    Release-Build: Der Compiler macht IMO, was er will.

    VC++ Dokumentation schrieb:

    Whole program optimization allows the compiler to perform optimizations with information on all modules in the program. Without whole program optimization, optimizations are performed on a per module (compiland) basis.

    Whole program optimization is off by default and must be explicitly enabled. However, it is also possible to explicitly disable it with /GL-.

    With information on all modules, the compiler can:

    - Optimize the use of registers across function boundaries.
    - Inline a function in a module even when the function is defined in another module.

    (Quelle)



  • ich brauche für meine Hausaufgaben 1 bis 2 Statements, es geht darum ein Programm zu coden was sehr schnell ist und sehr klein in C++.

    ;
    ;
    

    Viel kleiner und schneller wird's nicht.

    inline hat einen nachteil: es wird mehr code erzeugt.

    Ungenaue Pauschalisierung. Resultiert imo aus der typischen "raten statt messen"-Haltung, die bei inline irgendwie viel zu oft angewendet wird. Für entsprechend kleine Funktionen kann der inline-Code auf jeden Fall problemlos kleiner sein, als der out-of-line Code.

    Und ich denke mal, der Compiler macht das schon besser als ich

    Vielleicht besser als dein Bauch. Du, dein Profiler und viele Benutzungsszenarien auf der anderen Seite können dem Compiler auf jeden Fall voraus sein.

    und wer kann die funktionen optimal inlinen? der compiler

    Das ist ein Wunschtraum. Zumindest entnehme ich das aus der letzten ca. 7.8-Millionen Beiträge umfassenden comp.lang.c++.moderated-Diskussion zum Thema.
    Ein Fazit war da: inline ist nicht wie register. Es gibt nach wie vor Situationen in denen handgesetzte inlines eine Menge bringen.

    Imo gilt hier nach wie vor der Grundsatz, der für alle low-level Code-Tuning-Optionen gilt:
    Messen und abwägen. Nicht raten und hoffen.



  • HumeSikkins schrieb:

    inline hat einen nachteil: es wird mehr code erzeugt.

    Ungenaue Pauschalisierung.

    Ich habe das eher im Sinne von:

    f(); f();

    f liegt nur 1 mal im Code - wenn es inline wäre, wäre es 2 mal hier.
    Das erzeugt mehr Code -> größere Dateien.
    Resultat: auch ein inline gibt es nicht gratis.

    Mehr wollte ich damit nicht sagen.



  • Inline beduetet überflüssiger Code für's übergeben der Parameter entfällt, der Code um in die Funktion zu springen fehlt, der Code in der Funktion zum zurückspringen fehlt, ...



  • Shade Of Mine schrieb:

    HumeSikkins schrieb:

    inline hat einen nachteil: es wird mehr code erzeugt.

    Ungenaue Pauschalisierung.

    Ich habe das eher im Sinne von:

    f(); f();

    f liegt nur 1 mal im Code - wenn es inline wäre, wäre es 2 mal hier.
    Das erzeugt mehr Code -> größere Dateien.
    Resultat: auch ein inline gibt es nicht gratis.

    Mehr wollte ich damit nicht sagen.

    Das hast du geraten. Sieh dir mal dieses Beispiel an:

    int a;
    inline void set_a(int x,int y){a=x-y;}
    //...
    set_a(5,6);set_a(9,3);
    

    das würde in ASM etwa das geben:

    mov eax dword[x]
    sub eax dword[y]
    mov dword[a] eax
    mov eax dword[x]
    sub eax dword[y]
    mov dword[a] eax
    

    So und nun das ganze ohne inline:

    set_a:
    mov eax dword[esp+8]
    sub eax dword[esp+4]
    mov dword[a] eax
    ret
    ;...
    push dword[x]
    push dword[y]
    call set_a
    add esp 8
    push dword[x]
    push dword[y]
    call set_a
    add esp 8
    

    Allein der Code um set_a aufzurufen ist länger als die inline Version. Im Fall von kleinen 1 Statement Funktionen bietet inline nur Vorteile (von man vom Debugen mal absieht)


Anmelden zum Antworten