Frage

Ich möchte, warum genau statische Variablen in C, C ++ und Java wissen, werden durch standardmäßig Null initialisiert? Und warum ist dies für lokale Variablen nicht wahr?

War es hilfreich?

Lösung

Warum werden die statischen Variablen determinis initialisiert und lokale Variablen nicht?

Sehen Sie, wie die statischen Variablen umgesetzt werden. Der Speicher für sie zu Verbindungszeitpunkt zugeordnet ist, und der Anfangswert für sie auch zur Verknüpfungszeit zur Verfügung gestellt. Es gibt keine Laufzeit-Overhead.

Auf der anderen Seite ist der Speicher für lokale Variablen zur Laufzeit zugeordnet. Der Stapel muss wachsen. Sie wissen nicht, was es war vor. Wenn Sie möchten, können Sie, dass der Speicher (Null it) klar, aber das würde einen Laufzeitaufwand entstehen. Die C ++ Philosophie ist „Sie zahlen nicht für Dinge, die Sie nicht verwenden“, so ist es nicht, dass der Speicher standardmäßig nicht Null.

OK, aber warum sind statische Variablen auf Null initialisiert, und nicht einen anderen Wert?

Nun, mögen Sie in der Regel etwas mit diesen Variablen tun. Aber wie Sie wissen, wenn es initialisiert wurde? Sie könnten eine statische boolsche Variable erstellen. Aber dann hat es auch zuverlässig zu etwas initialisiert werden (vorzugsweise false). Wie über einen Zeiger? Sie würden eher wollen sie auf NULL als einige zufällige Müll initialisiert. Wie wäre es eine Struktur / record? Es hat einige andere Datenelemente im Inneren. Es macht Sinn, alle von ihnen auf die Standardwerte zu initialisieren. Aber der Einfachheit halber, wenn Sie die „initialisieren, um 0“ Strategie, Sie haben nicht die einzelnen Mitglieder zu prüfen und deren Typen zu überprüfen. Sie können nur den gesamten Speicherbereich auf 0 initialisiert werden.

Das ist nicht wirklich eine technische Anforderung. Die Semantik der Initialisierung könnte noch gesund angesehen werden, wenn der Standardwert ist etwas anderes als 0, aber immer noch deterministisch. Aber was soll dieser Wert? Sie können ganz leicht erklären, warum 0 verwendet wird (obwohl in der Tat etwas willkürlich klingen), aber -1 oder 1024 zu erklären scheinen noch schwieriger zu sein (vor allem, dass der Variable nicht groß genug sein kann, diesen Wert zu halten, etc).

Und Sie können die Variable explizit immer initialisiert werden.

Und Sie haben immer Absatz 8.5.6 des C ++ Standard, der aussagt „Jedes Objekt statischer Speicherdauer wird beim Programmstart Null initialisiert werden“.

Für weitere Informationen verweisen wir auf andere Fragen:

Andere Tipps

Absatz 8.5.6 der C ++ Standard besagt, dass:

„Jedes Objekt statischer Speicherdauer wird beim Programmstart Null initialisiert werden“

(Der Standard sagt auch, dass die Initialisierung von lokalen Variablen ist nicht definiert)

Wie, warum, ist der Standard nicht sagen;). Eine Vermutung ist, dass es relativ einfach ist, ohne zusätzliche Nachteile zu implementieren

Beim Reden für Java:

lokale Variablen initialisiert werden müssen, bevor Sie darauf zugreifen können, weil es sich um ein Sicherheitsgewinn ist. Der Compiler überprüft für Sie, wenn die Variable definitly gesetzt.

oder statische Klassenvariablen (mit einem Objekttyp) mit null initialisiert, da der Compiler kann nicht überprüfen, ob sie bei der Kompilierung initialisiert werden. Anstatt das Programm zu lassen, scheitern, wenn es eine nicht initialisierte Variable zugreift, wird es mit null initialisiert impliziten werden.

Variablen mit einem nativen Typ kann keinen null Wert bekommen, also nicht-lokale Variablen mit 0 oder false, als Ausweich initialisiert. Es ist nicht beste Lösung, sicher, aber ich habe keine besseren kennen. ; -)

So zu einem gewissen Grad sind diese nur Entscheidungen Entwurf auf dem Teil der Sprachdesigner. Aber die wahrscheinlichen Gründe für diese Entscheidungen in Java sind:

  • für statisches / Membervariablen, wenn man sie zu etwas initialisieren geht, dann ist Null ein bequemer Wert, weil (a) es ist im Allgemeinen einen geeigneten Wert „nicht auf irgendetwas anderen besonderen“ zu bedeuten, und ist der Wert Sie hätte ohnehin in einigen Fällen wie Zähler gepflückt; und (b) intern, ist es wahrscheinlich, dass die Null kann für „besondere“ Werte verwendet werden, insbesondere zur Darstellung null im Fall einer Objektreferenz.
  • für lokale Variablen, so dass sie keinen Standard geben können für die Regel, dass der Programmierer zwingt einen Wert zu setzen, bevor die Variable gelesen wird, die eigentlich in so dass der Compiler kann nützlich sein, bestimmte Fehler erkennen.

Im Fall von lokalen Variablen, dann ist es auch denkbar, dass eine lokale Variable deklariert werden kann (die an der Bytecode / Maschinencode-Ebene im Wesentlichen Stapelspeicher Mittel Zuweisen / Bewegen des Stapelzeigers), aber dann nie wirklich geschrieben / gelesen in einem bestimmten Codepfad. Also kein Standard mit vermeidet dabei unnötige Arbeit eines Ausfalls in den Fällen zu setzen.

ich wiederhole, aber diese sind Design-Entscheidungen zu einem gewissen Grad. Sie sind im Wesentlichen ein Kompromiss zwischen dem, was wahrscheinlich für JVM-Implementierungen und bequem für Programmierer bequem sein.

N. B. In C / C ++, "statisch" Variablen bedeutet eine andere Sache zu statischen Variablen in Java!

Ich habe keine Ahnung von Java und ich bezweifle, dass es für die Statik / Einheimischen in Java anders ist.

Wie für C und C ++, es geht um Programmierer über ihren Code-Effekt sorgen und liebendes Wesen in Kontrolle. lokale Variablen initialisieren würde die Ausführung von zusätzlichen Code bedeutet jedes Mal Programm in den Anwendungsbereich. Für häufig verwendete Funktionen, die eine Katastrophe sein kann.

Das hat mit dem Konzept zu tun „zahlt nur für das, was Sie“ in C / C ++.

Für statische Variablen kann eine Initialisierung ohne Codegenerierung durchgeführt werden. Die Objektdatei enthält die Anfangswerte für die Variablen im Datensegment und wenn das Betriebssystem lädt die ausführbaren es lädt und bildet diese Datensegment vor dem Programmstart ausgeführt wird.

Für lokale Variablen gibt es keine Möglichkeit, sie ohne Code initialisiert werden, da sie einmal nicht initialisiert werden, sollten sie jedes Mal, wenn ihr Umfang eingeben initialisiert werden; auch sind sie in dem Stapel zugeordnet ist, und wenn die Zuweisung des Anfangswert in dem Stapel im allgemeinen Fall auftritt, ist einfach das, was es vorher war (mit Ausnahme der seltenen Momente, wachsen Sie den Stapel mehr als zuvor gewachsen ist).

So implizit eine lokale Variable zu initialisieren die Compiler benötigen würden Code zu generieren, ohne dass der Programmierer explizit zu befehlen, dies zu tun, die ganz gegen diese „Philosophie“ ist.

Wir über Java, soweit ich weiß, sind Variablen immer initialisiert, wenn das Programm den Rahmen eintritt, ganz gleich, ob sie statisch sind oder nicht. Der einzige wesentliche Unterschied zwischen ihnen ist, dass der Umfang der statischen Variablen das gesamte Programm ist. Da das Verhalten unter allen von ihnen im Einklang steht.

Das ist nur eine Vermutung, aber es könnte die Art und Weise ist es für Statik, da es einfach zu implementieren, und nützlich.

Der Compiler kann alle Variablen in einen Speicherbereich contigous zusammen zuzuteilen, und dann entweder Code (ein einzelnes memset() call) emittieren, es zu löschen, bevor main() genannt wird. In vielen Fällen kann es auf Funktionen des Betriebssystems ausführbaren Dateiformat stützen sich auch, wenn das Format unterstützt „ bss Abschnitte ", die stattdessen durch den Lader gelöscht werden. Das spart Platz in der ausführbaren Datei, könnten Sie haben

static unsigned char megabyte[1 << 20];

und die ausführbare Datei würde von einem Megabyte nicht wachsen.

Für lokale Variablen, keine von diesen gelten; sie sind „on the fly“ zugeordnet (in der Regel auf einem Stapel), und es wäre eine Verschwendung von Ressourcen, sie zu löschen, da sie typischerweise sehr bald sowieso zugewiesen gehen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top