Hallo,
sehe ich das Richtig das #define eine weniger Prozessorzyclen braucht,
und globale Variablen weniger Speicher benötigen???
Danke für die mühe die ich mache…
Hallo,
sehe ich das Richtig das #define eine weniger Prozessorzyclen braucht,
und globale Variablen weniger Speicher benötigen???
Danke für die mühe die ich mache…
jetzt nur auf den punkt speicher bezogen ??
also define ist was ganz anderes als variable
http://de.wikibooks.org/wiki/C-Programmierung:_Varia…
Symbolische Konstanten
Im Gegensatz zu Variablen, können sich konstante Werte während ihrer gesamten Lebensdauer nicht ändern. Dies kann etwa dann sinnvoll sein, wenn Konstanten am Anfang des Programms definiert werden, um sie dann nur an einer Stelle im Quellcode anpassen zu müssen.
.....
Um einen bewussten oder unbewussten Fehler des Programmierers zu vermeiden, verhindert der Compiler, dass der Konstante ein neuer Wert zugewiesen werden kann.
In der ursprünglichen Sprachdefinition von Dennis Ritchie und Brian Kernighan (K&R) gab es nur die Möglichkeit, mit Hilfe des Präprozessors symbolische Konstanten zu definieren. Dazu dient die Präprozessoranweisung #define . Sie hat die folgende Syntax:
#define identifier token-sequence
......
Beispiel
#define MWST 19
wird jede vorkommende Zeichenkette MWST durch die Zahl 19 ersetzt. Eine Ausnahme besteht lediglich bei Zeichenketten, die durch Hochkomma eingeschlossen sind, wie etwa der Ausdruck
und variablen sind so gross wie der inhalt sein wird, oder ist , aber das varierirt gerne.
Hossa
Mit „#define“ werden Konstanten definiert, die während der Compilierung direkt in den Quelltext eingetragen werden. Daher kann der Compiler einen Code erzeugen, der die Konstante direkt enthält. Beispiel:
#define DREI 3
a=DREI*a;
Der Compiler ersetzt die DREI durch den Text(!) der dahinter definiert ist, so dass der Befehl wie folgt aussieht:
a=3*a;
Der Compiler kann nun optimierten Code erzeugen, weil er den Faktor 3 direkt in den Maschinenbefehl (imul) einbauen kann.
Bei einer globalen Variablen sieht es etwas anders aus:
int DREI=3;
a=DREI*a;
Hier erzeugt der Compiler einen Code, bei dem erstmal nachgeschaut werden muss, welcher Wert in der Variablen DREI drin steht. Dieser Wert muss aus der entsprechenden Speicherstelle geholt werden. Erst dann kann der Befehl für die Multiplikation erolgen. Die Adressierung ist hier also etwas „aufwändiger“.
Moderne Compiler optimieren jedoch so gut, und auch die Prozessor-Befehle sind entsprechend optimiert, dass dieser Effekt heute bezüglich der Laufzeit keine Rolle mehr spielt.
Viele Grüße
Hase
#define benötigt überhaupt keine Prozessorzyklen, da es eine Präprozessor-Direktive ist. Falls ein definierter Wert auftaucht, wird er VOR der Kompilierung im Code ausgetauscht, rein auf Zeichenbasis:
#define MIST aua_aua ersetzt überall nach dieser Anweisung MIST gegen aua_aua. Natürlich kann man so auch konstante Werte definieren:
#define VAL 5
int val = VAL; wird zu val = 5;
Konstanten im Code werden oft optimaler behandelt als Variablen (es wird zB. kein Speicher reserviert), aber es findet keine Typprüfung statt.
Deshalb ist die Alternative zu #define const:
const int VAL = 5;
int val = VAL;
Jeder auch nur durchschnittliche Compiler behandelt const genauso optimal wie #define, aber da ein const einen Typ hat, kann der Compiler eine Typprüfung durchführen.
mfg
Gert