Compiler optimisation und externe Funktionsaufrufe



  • Gib es eine Möglichkeit dem Compiler mitzuteilen, dass eine externe Funktion keinerlei Auswirkungen hat und weg-optimiert werden kann wenn deren Rückgabewerte nicht verwendet werden?

    Ich gehe davon aus dass es in Richtung Compiler spezifische Erweiterungen geht. In meinem Fall ist das GCC und MSVC.


  • Mod

    Suchste const ?



  • Stimmt, kann man ja auch auf externe c Funktionen anwenden. Das war einfacher als gedacht! 🙂



  • Ja und optimiert er sie dann tatsächlich weg? Ich bin da eher skeptisch, vor allem bei externen C Funktionen.



  • Ist vielleicht eine blöde Frage aber wieso ist das so wichtig? Der einzige Grund den ich mir vorstellen kann ist, dass man sich etwas Tipparbeit erspart. Aber wenn man auf jeden Fall verhindern will das eine Funktion unnötigerweise aufgerufen wird sollte man seinen Code einfach so schreiben.



  • Mechanics schrieb:

    Ja und optimiert er sie dann tatsächlich weg? Ich bin da eher skeptisch, vor allem bei externen C Funktionen.

    Laut gcc.godbolt.org schon bei O1.


  • Mod

    Nathan schrieb:

    Mechanics schrieb:

    Ja und optimiert er sie dann tatsächlich weg? Ich bin da eher skeptisch, vor allem bei externen C Funktionen.

    Laut gcc.godbolt.org schon bei O1*^[citation needed]^*.



  • Arcoth schrieb:

    Nathan schrieb:

    Mechanics schrieb:

    Ja und optimiert er sie dann tatsächlich weg? Ich bin da eher skeptisch, vor allem bei externen C Funktionen.

    Laut gcc.godbolt.org schon bei O1*^[citation needed]^*.

    [[gnu::const]] int foo();
    void bar()
    {
    	foo();
    }
    

    Gibt:

    bar():
      rep ret
    

    Bei -std=c++11 -O1 und GCC 4.9.2 für x86.
    https://goo.gl/eOrspj


  • Mod

    👍



  • sebi707 schrieb:

    Ist vielleicht eine blöde Frage aber wieso ist das so wichtig? Der einzige Grund den ich mir vorstellen kann ist, dass man sich etwas Tipparbeit erspart. Aber wenn man auf jeden Fall verhindern will das eine Funktion unnötigerweise aufgerufen wird sollte man seinen Code einfach so schreiben.

    Es macht durchaus Sinn.
    Z.B. in meinem Fall schreibe ich eine statisch zu linkende OpenGL Bibliothek welche unterschiedlich zum Einsatz kommt.
    Und wenn const Definitionen genug sind, dass der Compiler jedes mal alles unnötige weg optimieren kann, warum dann nicht?
    Es ist sehr viel einfacher und genauer als tonnenweise #ifdef im code zu haben.



  • Klar ist das top.
    Der Compiler kann dann ja auch so sachen optimieren wie

    int val = Foo(); // Foo = "const"
    // ...
    if (something<T>::that_is_probably_compile_time_constant)
        UseVal(val);
    

    Hier kann der Aufruf von Foo() dann u.U. ganz wegoptimiert werden.

    Hab nicht ausprobiert ob GCC solche Fälle auch versteht, aber es würde mich wundern wenn nicht. Wenn Foo() inline erweitert werden kann werden solche Fälle ja auch ohne Probleme erkannt und optimiert.

    Und selbst wenn Foo() inline erweitert werden kann könnte man "const" noch verwenden. z.B. um Funktionen zu taggen die streng genommen beobachtbare Effekte haben, wo es aber wurst ist ob diese beobachtet werden oder nicht. z.B. Funktionen die Speicher anfordern (temporäre Strings/Container etc.). Oder Funktionen die irgendwelche Config-Werte aus ner DB lesen -- was ja auch reichlich sinnlos ist wenn man den Wert dann nichtmal braucht. In den meisten Fällen kann man solche Aufrufe dann auch komplett weglassen.


Anmelden zum Antworten