Funktionspointer und Inline



  • Hallo!

    Ich habe eine Event-State-Machine, bei der je nach Event und Zustand ein bestimmter Funktionspointer eine passende, sehr kleine Funktion aufruft.

    Frage 1: Hindert irgend etwas den Compiler daran, solche Funktionen inline zu machen?

    Frage 2: Wie kann man zuverlässig erkennen, ob eine Funktion inline compiliert wurde? Im Profiler werden die Funktionsaufrufe angezeigt, daher nehme ich an, daß die inline-Empfehlung ignoriert wurde. Ich arbeite mit g++ und kprof.

    Danke



  • 1. Nein.
    2. Warum ist das relevant? Man sieht es sicher im Assemblercode, aber ich weiss nicht, wie leicht das zu finden ist, wenn da richtig optimiert wird.



  • Ob eine Funktion "inline ist", hängt ganz vom Programmierer ab.
    Ob eine Funktion "geinlined wird", ist Sache des Compilers.

    Wenn Du an einer Stelle aus einer Tabelle einen Funktionszeiger rausholen musst und dies Abhängig von einem zur Laufzeit bestimmten Wert ist, kann der Funktionsaufruf an der Stelle natürlich nicht "geinlined" werden.



  • Wenn deine Event-State-Machine aber compiletime-konstant ist, könntest du diese ggf. hardcodieren, um ein inlining wieder zu ermöglichen:

    state1:
        switch(nextEvent()) {
    
        case event1: 
            call_function_xyz(); //kein FP nötig
            goto state42;
    
        case event2:
            call_function_qwerty();  //kein FP nötig
            goto state77;
    
        ...
    
        }
    
    state2:
        switch(nextEvent()) {
    
        ....
    


  • drakon schrieb:

    1. Nein.
    2. Warum ist das relevant? Man sieht es sicher im Assemblercode, aber ich weiss nicht, wie leicht das zu finden ist, wenn da richtig optimiert wird.

    Das ist relevant, weil ich Ärger mit der Laufzeit habe. Die Mini-Funktionen werden millionenfach aufgerufen. Daher ist der Automat zwar elegant, aber zu langsam, wenn kein inlining geht.

    lg



  • krümelkacker schrieb:

    Wenn Du an einer Stelle aus einer Tabelle einen Funktionszeiger rausholen musst und dies Abhängig von einem zur Laufzeit bestimmten Wert ist, kann der Funktionsaufruf an der Stelle natürlich nicht "geinlined" werden.

    Ah, das ist übel, denn genau das passiert hier. Gibt es denn gar keine Chance,
    da irgendwie mit einer Funktionspointer-Tabelle zu arbeiten? Sonst muß ich das
    Ding wirklich mit switch schreiben, wie 'life' schon vorgeschlagen hat. Wär schade, denn da habe ich viel Arbeit investiert.

    lg



  • cout2 schrieb:

    drakon schrieb:

    1. Nein.
    2. Warum ist das relevant? Man sieht es sicher im Assemblercode, aber ich weiss nicht, wie leicht das zu finden ist, wenn da richtig optimiert wird.

    Das ist relevant, weil ich Ärger mit der Laufzeit habe. Die Mini-Funktionen werden millionenfach aufgerufen. Daher ist der Automat zwar elegant, aber zu langsam, wenn kein inlining geht.

    lg

    Lächerlich...

    Wenn es wirklich so wichtig ist, dann kopier es überall rein um zu testen, ob
    es was bringt.

    Meine These: Bringt 0

    Was willste jetzt tun?
    Evtl. hat dein Compiler ein paar Flags die deinem Wunsch nachkommen könnten.



  • lol... 🤡

    Ich bin auch nicht mehr ganz wach ^^
    Wie soll ein Verweis, der sich theoretisch verändern kann denn geinlinet werden 😮



  • Inline suckz schrieb:

    Lächerlich...

    Wenn es wirklich so wichtig ist, dann kopier es überall rein um zu testen, ob
    es was bringt.

    Meine These: Bringt 0

    Was willste jetzt tun?
    Evtl. hat dein Compiler ein paar Flags die deinem Wunsch nachkommen könnten.

    Aus Erfahrung kann ich Dir versichern, daß Inlining bei millionenfach aufgerufenen Mini-Funktionen die Laufzeit sehr stark beeinflußt. Wenn man ein Anhänger von 1000-Zeilen-Funktionen ist, wird mans natürlich nicht spüren.

    lg


Anmelden zum Antworten