 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Benjamin von Eicken Guest
|
Posted: Wed Jun 09, 2004 8:34 pm Post subject: Compiler-Optimierung |
|
|
Hi
Ich habe folgende Frage:
Wenn ich ein Konstrukt habe wie:
do {
\ BlaBla
}
while (irgendEinBoolscherAusdruck);
wird in jedem Durchlauf die Beingung geprüft.
Falls diese konstant true ist, lässt der Compiler
die Abfrage weg?
Also wenn ich das ganz in pseudo-Assembler-Code schreibe
etwa so:
\ Erste Variante
LABEL Test
\ BlaBla
EQUALS irgendEinBoolscherAusdruck,true JUMP Test
und wenn der Ausdruck immer true ist (eine Kosntante), ob dann etwas wie
LABEL Test
\ BlaBla
JUMP Test
dabei rumkommt.
Gibt es da einen Standard, auf den ich mich verlassen kann?
MfG
Benjamin von Eicken
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Jun 10, 2004 9:48 am Post subject: Re: Compiler-Optimierung |
|
|
Benjamin von Eicken wrote:
| Quote: |
Wenn ich ein Konstrukt habe wie:
do {
\ BlaBla
}
while (irgendEinBoolscherAusdruck);
wird in jedem Durchlauf die Beingung geprüft.
Falls diese konstant true ist, lässt der Compiler
die Abfrage weg?
[snip]
Gibt es da einen Standard, auf den ich mich verlassen kann?
|
Alles eine Frage der Implementierungsqualität - der Standard
verbietet dem Compilerbauer nicht mal, das Programm nach jedem
Schleifendurchlauf 10 Minuten warten zu lassen .
Im Ernst - praktisch würde ich erwarten, dass ein moderner
Compiler den Test weglässt und einen unbedingten Sprung einbaut,
sofern der zu testende bool-Ausdruck eine bereits bei der
Übersetzung bekannte Konstante ist.
Ein kleiner Test mit gcc 3.3.1 cygwin, wobei der erzeugte Kode
mittels "objdump -DC -S <exe_file>" angeguckt werden kann,
zeigt dann auch, dass nicht nur der Test wegoptimiert wird,
sondern auch infolgedessen nicht erreichbarer Kode gar nicht erst
ins erzeugte Programm gesteckt wird (sei es mit 'if/else', 'while',
'do/while' oder 'for').
Andere moderne Compiler sollten das eigentlich nicht schlechter
hinkriegen als gcc, besonders wenn sie mehr kosten!
Falls erwünscht, lässt sich diese Optimierung mittels gut
plaziertem 'volatile' verhindern.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Jun 10, 2004 10:22 am Post subject: Re: Compiler-Optimierung |
|
|
Benjamin von Eicken wrote:
| Quote: | Hi
Ich habe folgende Frage:
Wenn ich ein Konstrukt habe wie:
do {
\ BlaBla
}
while (irgendEinBoolscherAusdruck);
wird in jedem Durchlauf die Beingung geprüft.
Falls diese konstant true ist, lässt der Compiler
die Abfrage weg?
|
Sicher ist das zwar nicht, aber ich würde es von einem guten Compiler
erwarten. Für Endlosschleifen gibt es aber den Konstrukt:
for (;
{
//tu was
}
Auch recht häufig ist die while-Schleife in anderer Richtung:
while (true)
{
//tu was
}
Falls es speziell um Endlosschleifen geht, würde ich diese Varianten
bevorzugen, da man schon am Kopf erkennt, daß die Schleife eine
Endlosschleife ist.
| Quote: | Also wenn ich das ganz in pseudo-Assembler-Code schreibe
etwa so:
\ Erste Variante
LABEL Test
\ BlaBla
EQUALS irgendEinBoolscherAusdruck,true JUMP Test
und wenn der Ausdruck immer true ist (eine Kosntante), ob dann etwas
wie
LABEL Test
\ BlaBla
JUMP Test
dabei rumkommt.
Gibt es da einen Standard, auf den ich mich verlassen kann?
|
Nein. Die C++-Norm legt nicht fest, was genau ein Compiler aus einem
bestimmten Stück Code macht, sondern nur, wie sich das resultierende
Programm verhält.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|