001
07.09.2008, 15:28 Uhr
Hans
Library Walker (Operator)
|
Hi,
die Empfehlung, Variablen erst so spät wie möglich zu deklarieren, hat zum Einen damit zu tun, wie lokale Variablen von C++ intern verwaltet werden. Die werden nämlich alle auf dem Stack des Prozessors abgelegt, dessen Speicherkapazität begrenzt ist. Da sich der Gültigkeitsbereich jeweils nur auf einen Block bezieht, nämlich jenem, in dem sie deklariert sind, existieren sie auch nur dort. Beispiel:
C++: |
for (int i=0; i<x; i++) { /* tue irgendwas */ }
|
Die Variable i existiert hier nur innerhalb der Schleife. Sobald der Code zur Bearbeitung des Schleifenrumpfes verlassen wird, hört die Variable i auf zu existieren und der Speicherplatz kann anders verwendet werden.
In Pascal hat die Deklaration der Variablen am Anfang ebenfalls mit der Speicherverwaltung zu tun. Da müssen die Variablen vorher deklariert werden, damit der Compiler den benötigten Speicherplatz berechnen kann. Das war zur Zeit der Entwicklung von Pascal nötig, hatte aber auch den Zweck, Programmierer dazu zu erziehen, sich mehr Gedanken über den benötigten Speicherplatz zu machen.
Und ganz wichtig: In C++ (und auch in C) gibt es einen Unterschied zwischen deklaration und definition von Variablen. Eine Deklaration sagt demn Compiler lediglich, das es eine Variable gibt. Das merkt er sich dann, reserviert aber keinen Speicherplatz dafür. Erst bei der Definition einer Variablen wird auch Speicherplatz dafür bereit gestellt. Ich glaube, das steht hier auch schon irgendwo ausführlicher beschrieben.
Zum Vergleich mal eine Codesequenz in Pascal und C++ : Pascal:
Code: |
var a, b, c : integer; t : char;
|
Hier werden 4 Variablen deklariert, und entsprechend Speicherplatz zur Verfügung gestellt.
C++:
Hier werden ebenfalls 4 Variablen deklariert, aber der Compiler reserviert dafür noch keinen Speicherplatz, sondern merkt sich erst mal nur, das es diese Variablen geben soll.
Der andere Grund, warum man Variablen in C++ erst dann definieren soll, wenn man sie braucht, hat mit der OOP zu tun. Wenn sich hinter einer Variablen ein umfangreiches Objekt verbirgt, dann wird ein Konstruktor aufgerufen, der dafür entsprechend Speicherplatz reserviert. Dieser Aufruf benötigt auch Rechenzeit, die man u.U. anderswo besser gebrauchen könnte. Wenn nun am Anfang einer Funktion viele Objekte erstellt werden, dauert es erst mal eine Weile, bis die Objekte erstellt sind, bevor die Funktion das tut, was sie soll. Am Ende der Funktion müssen die erstellten Objekte alle wieder zerstört werden (Destruktor aufruf), was auch wieder Rechenzeit kostet. Wird so eine Funktion nun öfter aufgerufen, ist der Prozessor möglicherweise mehr damit beschäftigt, Objekte zu erstellen und zu zerstören, als es nötig ist, und die Bearbeitung der eigentlichen Funktion beansprucht nur einen Bruchteil der Gesamtlaufzeit der Funktion.
Dann kann es auch vorkommen, das Destruktoren nicht sauber geschrieben sind, und Objekte dadurch nicht vollständig zerstört werden, was zu Speicherlecks führt.
So, ich hoffe, das war einigermassen verständlich und vollständig. Meine persönliche Meinung ist ja, das man die Angewohnheit aus Pascal, Variablen am Anfang zu deklarieren ruhig beibehalten kann, solange man es mit Standarddatentypen zu tun hat. Auch für zusammengesetzte Datentypen, also Records in Pascal halte ich es so, solange dadurch keine Speicherplatzverschwendung im grossen Stil entsteht. Sobald aber Objekte, und damit Konstruktoren und Destruktoren ins Spiel kommen, ist es Vernünftig, darüber noch mal nachzudenken, und Variablen wirklich erst dann zu definieren, wenn man sie braucht.
Hans -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 07.09.2008 um 15:31 Uhr von Hans editiert. |