025
05.11.2004, 23:35 Uhr
Hans
Library Walker (Operator)
|
Zitat von (un)wissender: |
@Hans Bei einem optimierenden Compiler sieht das anders aus, ich vermute du hast die freie CommandLine-Version des bcc 5.51 (oder so ähnlich).
|
Ja; Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
Zitat: |
Der optimiert nahezu überhaupt nicht.
|
Doch schon, aber nicht sehr viel. Mit allen Optimierungsoptionen an wird daraus das hier:
Code: |
_main proc near ?live1@0: ; ; int main() ; { ; ; /* ; * while-Schleife ; */ ; while(1) ; { ; funktion(); ; @1: @2: call _funktion jmp short @2 ; ; } ; ; return 0; ; xor eax,eax ; ; } ; @4: ret _main endp align 4 _funktion proc near ?live1@64: ; ; int funktion() ; { ; int a; ; a = 5; ; @5: mov eax,5 ; ; return a; ; } ; @7: @6: ret _funktion endp
|
Dann hab ich noch einen Visual Age C++ Compiler von IBM, der mach mit allen Optimierungsoptionen das hier:
Code: |
[E:\ibmcpp\working]icc /Fa+ /G4 /O+ /Oc+ /C+ endloslp.c IBM VisualAge C ++ for OS/2, Version 3 (C) Copyright IBM Corp. 1991, 1995. - Licensed Materials - Program Property of IBM - All Rights Reserved.
endloslp.c(14:9) : informational EDC0424: The condition is always true. endloslp.c(16:5) : warning EDC0304: No function prototype given for 'funktion'.
[E:\ibmcpp\working] --------------------------------------------------------------------- CODE32 segment
public funktion funktion proc
; 29 return a; mov eax,05h ret funktion endp
public main main proc
; 14 while(1) @BLBL2:
; 16 funktion(); call funktion
; 14 while(1) jmp @BLBL2 main endp CODE32 ends end
|
Zitat: |
Der Vc .NET 2003 macht das ganze mit nur einem Befehl:
Code: |
00420770 jmp main+10h (420770h)
|
Da die Endlosschleife nicht wegoptimiert werden darf, gibt es einfach einen Sprung auf sich selber. Wäre die Schleife begrenzt, würden genau 0 Befehle gebraucht.
|
Ja gut, da können meine Compiler nicht mithalten... - aber dafür sind sie auch schon ein paar Jährchen alt. Und der IBM-Compiler optimiert doch schon mehr, als der von Borland. Aber insgesamt gesehen haben sie wirklich nicht die nötige KI eingebaut, um die nutzlose Funktion komplett weg zu optimieren.
Hans P.S. mir kommt da gerade noch 'ne andere Frage: Nehmen wir mal an, die Variable a in der Funktion sei mit volatile deklariert, und würde ein Hardwareregister repräsentieren. Dann bräuchte die Funktion nur etwa so aussehen:
C++: |
int funktion() { volatile int a;
return a; }
|
und der Compiler dürfte gar nichts dran optimieren, oder? Eine andere Frage wäre in diesem Zusammenhang noch, wo steht welches Register denn in a stehen sollte, aber dazu sollte man einen neuen Thread anfangen... -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 05.11.2004 um 23:40 Uhr von Hans editiert. |