Bei Ihrer statischen Version gibt es nur eine Variable, die irgendwo gespeichert wird, und jedes Mal, wenn die Funktion ausgeführt wird, wird genau dieselbe Variable verwendet. Auch bei rekursiven Aufrufen.
Die nicht-statische Version wird bei jedem Funktionsaufruf auf dem Stack gespeichert und nach jedem Aufruf zerstört.
Ihr Beispiel ist etwas kompliziert, was die eigentliche Arbeit des Compilers angeht, also lassen Sie uns zunächst einen einfacheren Fall betrachten:
void foo() {
static long i = 4;
--i;
printf("%l\n", i);
}
Und dann ein Hauptartikel wie dieser:
int main() {
foo();
foo();
return 0;
}
wird gedruckt
3
2
während bei
void foo() {
long i = 4;
--i;
printf("%l\n", i);
}
es wird gedruckt
3
3
Jetzt mit Ihrem Beispiel haben Sie eine Konstante, so dass der Wert nicht geändert werden kann, so dass der Compiler könnte spielen einige Tricks, während es oft keine Auswirkungen auf den erzeugten Code hat, sondern dem Compiler hilft, Fehler zu erkennen. Und dann haben Sie einen Zeiger, und beachten Sie, dass die Statik Auswirkungen auf den Zeiger selbst hat, nicht auf den Wert, auf den er zeigt. Die Zeichenkette "Hallo" aus Ihrem Beispiel wird also höchstwahrscheinlich im .data-Segment Ihrer Binärdatei abgelegt, und zwar nur einmal und so lange, wie das Programm lebt, unabhängig von der statischen Sache.
3 Stimmen
static const char
tienestatic
vorher geschriebenconst char