Funktion ohne Seiteneffekte
-
Hi,
kann eine Funktion ohne Seiteneffekte wegoptimiert werden?
void foo(int i, int b) { }
Ich habe oft gesehen, dass Leute hier Assemblerteile als "Beweis" gepostet haben. Ist das irgendein Visual Studio Feature oder so?
-
Wenn der Compiler sich sicher sein kann, Wo diese Funktion verwendet wird, kann er das sicher optimieren (Stichwort: Inlining). Die Berechnung der Parameter muß er natürlich trotzdem durchführen.
(allerdings wird er trotzdem eine minimal-Funktion dazu anlegen, für den Fall daß die Funktion vom Linker benötigt wird oder jemand ihre Adresse verwendet)
-
Sie kann aber nicht komplett ignoriert werden wie
for (int i = 0; i < 0xFFFF; ++i) ;
?
Wo ist da das Problem? Was will man mit der Adresse der Funktion machen? Könnte man nicht einfach einen Pointer auf ein ret nehmen, aber den Sprung dahin trotzdem vollständig wegoptimieren?
-
Du kannst die Adresse z.B. an eine andere Funktion weitergeben, die etwas damit machen will (z.B. Callbacks oder auch in STL-Algorithmen*). Dafür wird dann zumindest eine
ret
-Anweisung (und eventuell ein wenig Unterbau für die Stack-Verarbeitung) benötigt. In Situationen, wo die Funktion direkt aufgerufen werden soll, könnte der Compiler die Funktion tatsächlich komplett wegoptimieren.*Beispiel:
void mach_nix(int v) {} ... vector<int> daten; for_each(daten.begin(),daten.end(),mach_nix); /* ja, ich weiß, daß der Aufruf nicht besonders viel bewirkt :D - aber der Compiler muß schon einiges an Hintergrundwissen haben, um dort die Funktion wegzuoptimieren */
-
CStoll schrieb:
In Situationen, wo die Funktion direkt aufgerufen werden soll, könnte der Compiler die Funktion tatsächlich komplett wegoptimieren.
Und das wird jeder moderne Compiler auch tun sofern es sinnvoll ist...
-
Hier wird doch öfter mal ASM-Code gespostet ( http://www.c-plusplus.net/forum/288537 ), mit welchem Programm kann man das so sehen?
-
Mit nem Debugger? Abgesehen davon kann wohl jeder Compiler auch nen asm-dump ausgeben...
-
cooky451 schrieb:
Hier wird doch öfter mal ASM-Code gespostet ( http://www.c-plusplus.net/forum/288537 ), mit welchem Programm kann man das so sehen?
Ich benutze g++ -save-temps
http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Debugging-Options.html
-
dot schrieb:
Mit nem Debugger?
Bis man da zur entsprechenden Stelle kommt..
dot schrieb:
Abgesehen davon kann wohl jeder Compiler auch nen asm-dump ausgeben...
Wie geht das mit Visual Studio?
volkard schrieb:
Ich benutze g++ -save-temps
Werde ich mir mal angucken.
-
cooky451 schrieb:
Wie geht das mit Visual Studio?
Wenn ich mich recht erinnere, habe ich damit immer im Debugger Alt+8 gedrückt.
-
Habs gefunden,
set a breakpoint
run the program until it stops at the breakpoint
rightclick on the sourcecode and pick "show dissasembly"Danke euch!