Wann wird Speicher statischen Variablen in C ++ zugewiesen?

8

Ich bin ein Neuling in C ++ und habe ein Problem.

Ich habe in einem Buch gelesen, dass Speicher einer statischen Variablen zugewiesen wird, sobald das Objekt aus dieser Klasse erstellt wurde. Was nun, wenn ich diese statische Variable global mache? Wann würde es in diesem Fall initialisiert werden?

Außerdem habe ich in einigen Artikeln gelesen, dass statische Variablen auf Heap zugewiesen sind und sie sich nicht auf die Konstruktion von Objekten verlassen ... ist das wahr? Wenn ja, bitte erläutern Sie mir die Speicherinitialisierungsschritte, ich brauche Hilfe.

Vielen Dank!

    
Ishi 17.07.2010, 05:49
quelle

3 Antworten

25

Erstens: Hört auf, über globale Variablen in C und C ++ nachzudenken, oder ihr werdet eure Verwirrung aufrechterhalten. Das Problem ist komplexer als beispielsweise in Python oder Pascal, und daher können Sie nicht einfach ein einzelnes Wort für das Konzept / die Konzepte verwenden.

Zweitens gibt es keinen "Heap" oder "Stack" - dies sind Betriebssystem- und CPU-Details und haben nichts mit der abstrakten C ++ - Sprachspezifikation zu tun.

Nun haben Variablen 1) Geltungsbereich, 2) Verknüpfung und 3) Speicherklasse. Das static-Schlüsselwort wird verwendet, um alle drei Aspekte zu beeinflussen, je nachdem, wo Sie es verwenden.

Bereich : wo die Variable deklariert ist. Wenn es innerhalb einer Funktion ein Funktionsumfang ist, ist es außerhalb einer Funktion der Dateibereich (was Sie wahrscheinlich als "globale Variable" bezeichnen).

Verknüpfung : Ob die Variable von anderen Kompilierungseinheiten aus zugänglich ist (relevant, wenn Ihr Programm aus mehreren Quelldateien besteht).

Speicherklasse :

Statische Variablen werden beim Programmstart in implementierungsdefinierter Weise zugewiesen und bleiben bis zum Ende des Programms bestehen. Sie können nicht "befreit" oder "neu zugewiesen" werden. (Eine typische Implementierung sind BSS- und DATA-Segmente, wie andere bereits erwähnt haben).

Automatische Variablen existieren nur im Funktionsumfang, sie werden beim Funktionseintrag (normalerweise auf dem Stack der CPU) zugewiesen (und möglicherweise initialisiert) und bei Funktionsexit deallokiert.

Dynamische Speicherklasse ist, was Sie wahrscheinlich "den Heap" nennen. Das sind Variablen, deren Speicher direkt durch malloc / free oder new / delete manipuliert wird. Speicher für statische Variablen wird auf eine sehr andere Weise verwaltet als dynamischer Speicher, und die beiden Speicherarten sind grundsätzlich inkompatibel.

Beispiel:

%Vor%

Nun werden alle Variablen mit der statischen Speicherklasse (global1, global2 und x) vor dem Programmstart zugewiesen und initialisiert. Wenn Sie keine Anfangswerte angeben, werden sie standardmäßig in SUCHDIENST initialisiert. (Für primitive Typen bedeutet dies nur das Füllen mit Nullen).

Statische Variablen werden erst beim Beenden des Programms freigegeben. Das bedeutet, dass 'x' in der Funktion f NUR EINMAL (beim Programmstart) initialisiert wird und seinen Wert zwischen den Aufrufen der Funktion behält (im Gegensatz zu y, das bei jedem Funktionseintrag zugewiesen und bei jeder Funktion aufgehoben wird) Ausgang, also auch sein Wert zerstört). Beachten Sie, dass die Verwendung von statischen Variablen innerhalb von Funktionen sehr inkompatibel zu Multithreading und Reentrancy ist, sodass Sie sehr gut wissen, was Sie tun.

    
zvrba 17.07.2010, 06:35
quelle
8

Statische Variablen sind in Heap überhaupt nicht gespeichert.

Nicht initialisierte statische Variablen werden im BSS-Segment gespeichert.

Initialisierte statische Variable werden im Datensegment gespeichert.

Sie können diesen Artikel lesen, der alles auf großartige Weise erklärt: Ссылка

    
bits 17.07.2010 05:56
quelle
1

Beim Programmstart (vor dem Hauptspeicher) wird Speicher für Ihre statische globale Variable zugewiesen.

Ich habe keine Ahnung für die zweite Frage.

    
Quonux 17.07.2010 05:57
quelle

Tags und Links