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.
-
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.
-
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 retBei -std=c++11 -O1 und GCC 4.9.2 für x86.
https://goo.gl/eOrspj
-

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