Einsendung:
Soll ich Variablen aus dem Block herausziehen?
for(i=0;i<5;i=i+1)
{
int input;
cin>>input;
stack.push(input);
} |
Müßte es hier von der Logik her nicht heißen:
int input;
for(i=0;i<5;i=i+1)
{
cin>>input;
stack.push(input);
} |
Ist es denn tragisch, wenn man fünf mal nacheinander Speicher für eine Variable allokiert?
Das ist eine gute Frage. An sich ist es tragisch, daß diese Variable bei jedem Durchlaufen von
erzeugt und bei jedem Durchlaufen der schließenden geschweiften Klammer (dem Blockende) wieder vernichtet wird. Aber wir haben Glück, daß wir einen modernen Compiler haben. Für den ist es völlig selbstverständlich, daß er die Variable input nicht erzeugt, sondern daß er eines der freien Prozessor-Register dafür verwendet. Das kostet gar keine Zeit. Auch wenn kein Register mehr frei wäre, dann hätte der Compiler das Recht, die Zeile
einfach eigenständig vor die for-Schleife zu setzten. Es gilt eben, daß der Wert der noch nicht initialisierten Variablen input in jedem Durchlauf undefiniert ist. Da kann also alles Mögliche stehen. Wenn da dann jedesmal der Wert vom letzten input steht, dann ist das auch erlaubt. Es ist sogar davon auszugehen, daß der MSVC50 daraus folgendes macht:
{
int input;
int i=5;
while(i>0)
{
cin>>input;
stack.push(input);
i=i-1;
};
}; |
Der DJGPP ist noch viel "abgedrehter", was die Optimierungen angeht. Er darf folgenden Code erzeugen:
{
int input;
cin>>input;
stack.push(input);
cin>>input;
stack.push(input);
cin>>input;
stack.push(input);
cin>>input;
stack.push(input);
cin>>input;
stack.push(input);
}; |
Jetzt gilt es, folgendes zu überlegen:
- Das Eingeben der Zahl durch den Benutzer dauert so lange, daß der Rechner in der Zeit eine Million Variablen anlegen und wieder löschen könnte. Es fällt also wirklich nicht ins Gewicht.
- Solche einfachen Optimierungen kann der Compiler viel besser als Sie und ich. Also lassen wir es den Compiler machen.
Und ganz wichtig ist: Die Variable input ist in der for-Schleife sinnvoll, aber danach braucht man sie nicht mehr. Dann sollte sie danach auch nicht mehr sichtbar sein, damit man nicht aus Versehen darauf zugreift, und unter Umständen etwas ganz anderes meinte. In C++ gilt, daß man die Variablen so lokal wie möglich machen sollte. Oft mache ich einen Block nur deswegen auf, um eine Variable in diesem Block lokal zu halten. Der Code
{
int input;
int i=5;
while(i>0)
{
cin>>input;
stack.push(input);
i=i-1;
};
}; |
ist ein Beispiel dafür. Der äußere Block hat nur den Sinn, daß nach dem Block die Variable input nicht mehr sichtbar ist.
Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann
schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version]
[inhalt]
[index]
[Fehlerkorrektur, Verbesserungsvorschlag]
© Volkard Henkel <volkard@normannia.de>,
last update: 08/25/00
|