Frage

In C ++ die Speicherklasse Spezifizierer statischen Reserviert Speicher aus dem Datenbereich. Was bedeutet „Datenbereich“ bedeuten?

War es hilfreich?

Lösung

Zusätzlich zu dem, was Konrad gesagt, eine Variable als statisch erklärt, bedeutet im Wesentlichen, dass der Speicher für das mit dem Programm zugeordnet wird, wie er geladen wird, im Gegensatz zu auf dem Haufen oder Stapel. Verwendung nur statische Variablen in einer kritischen Anwendungen gedacht Historisch gesehen, dass der Speicherbedarf der Anwendung nicht zur Laufzeit ändern und daher war es weniger wahrscheinlich, dass aufgrund von Ressourcenbeschränkungen zum Scheitern verurteilt. Sie wissen nicht, ob dies immer noch wahr moderner Betriebssysteme ist.

Wenn Sie Ihren Compiler erhalten einen mapfile als Teil seiner Ausgabe zu erzeugen, können Sie sich auch sehen, was in all den verschiedenen Bereichen, einschließlich Daten.

Andere Tipps

Ich bin nicht vertraut mit dem Begriff „Datenbereich“, sondern Speicher wird häufig in „Codeabschnitt“ unterteilt und „Datenbereich“. Code befindet sich in der ehemaligen, Daten in den letzteren. Ich nehme an, dies ist es, was hier gemeint ist.

Classically, gibt es keinen Unterschied zwischen den beiden. viele moderne Betriebssysteme können jedoch verbieten die Ausführung von Code int er Datensegment (sofern die CPU diese Unterscheidung unterstützt). Dies geht manchmal durch den Slogan von „NX-Flag“, wie in „keine Ausführung“ und kann effektiv einige Fälle von bösartiger Code-Injektion verhindern.

/ EDIT: Beachten Sie, dass die C ++ Standard nicht einen „Datenbereich“ nicht erwähnt

.

Die Namen der Bereiche ändern sich je nach Plattform, Compiler und Linker.

In der Regel gibt es:

  • Programmtext. Der ausführbare Code Raum
  • Konstanten. Nicht ausführbare Konstanten
  • Stapel. Der Stapel
  • bss: Im Großen und Ganzen "Statik" in C / C ++ Bedingungen. "Block Gestartet von Symbol"
  • Daten: Uninitialised Globals
  • Heap:. Speicher zur Laufzeit zugewiesen

In diesem Fall wird die Dokumentation in Frage erhält den Namen „Datenbereich“ für die Verwendung, was traditionell das bss Segment genannt wird.

C Begriffe, die Speicherklassen-Bezeichner „statisch“ bedeutet Speicher, der für die Laufzeit des Programms vorhanden ist, und wird auf Null oder den Wert des initialiser initialisiert. Im Beispiel:

static int s_value_one;
static int s_value_two = 123;

Der Wert von s_value_one garantieren Null und der Wert von s_value_type zu sein, ist 123 an der Stelle der ersten Anweisung in main (). Wie dies wahr zu sein, ist ein Implementierungsproblem.

Was Konrad sagte.

Ich mag hinzufügen, dass es nach wie vor gibt es CPUs aus, dass die Daten nicht lesen kann, wenn er im Codeabschnitt und umgekehrt gesetzt wird. Diese haben vor häufigen Jahrzehnten, aber sie sind noch am Leben in der Embedded-Welt.

Auf den Punkt gebracht der Linker nur Gruppen Symbole gleicher Art zusammen. Auf dem PC haben Sie oft sogar mehr als einfachen Code und Datenbereiche. Sie werden Bereiche für nicht initialisierte Daten finden, nur Daten und andere OS abhängig Sachen auch lesen.

Es gibt viele Orte, die Daten könnten am Ende. Üblicherweise werden lokale Variablen auf dem Stack zugeordnet, und man kann die Dinge zuteilen auf dem Heap mit malloc (oder de Standardversion von ‚neuen‘). Statische Daten werden jedoch in der Regel zugewiesen, wenn Ihr Programm gestartet wird, und könnten am Ende überall - wo genau ist bis zu den Compiler, Betriebssystem und Executable-Format

.

Executable hat viele Informationen drin.

Eine ausführbare Datei, hat viele Arten / -klassen innerhalb seiner physikalischen Datei gespeicherten Daten.

zB das sind

  1. Executable Code Anweisungen
  2. Ressourcen
  3. Abhängigkeitsinformationen (die diese binären dlls hängt von)
  4. Die Symbole, die aus dieser binären
  5. exportiert

etc

muss es eine Möglichkeit geben, zu organisieren

all diese Informationen in dem EXE-Datei-Format, so dass das Betriebssystem leicht alle Informationen finden kann und die ausführbare Datei geladen werden und Dinge zu arbeiten. Zu diesem Zweck ein gemeinsames Binärformat (erstellt von M $ of-Kurs) genannt PE (Portable Executable) in der Windows-Welt verwendet wird. Alle Informationen, i nur aufgeführt (und viele mehr) sind im Detail in verschiedenen Abschnitten der binären beschrieben.

.data Abschnitt

Ein solcher Abschnitt ist der .data Abschnitt. Der .data Abschnitt enthält alle initialisiert globale und statische Daten, während der .bss Abschnitt werden die nicht initialisierte globale Daten enthält.

Warum benötigen Sie einen separaten Bereich für Globals?

Nun, ein global verhält sich wie eine globale, weil es in einem Speicherbereich geschaffen wird, die für die Lebensdauer eines Programms existiert und keine temporäre Datenstruktur wie ein Stapel, die wiederverwendet überschrieben / werden könnte. (Wie normale Auto-Variablen).

Compiler

Daher müssen diese Variablen in einiger permanenten Adresse in dem Heap zugewiesen werden, die leider nicht zum Zeitpunkt der Kompilierung bekannt sein. So sind die Compiler Orte alle globalen und statischen Variablen in diesem .data / .bss Abschnitt, und die Anweisungen, die auf diese Variablen beziehen beziehen sich auf diese relativ dauerhafte Adressen im .data / .bss.

Linkers

Wenn der Linker die ausführbare Datei in der realen Welt lädt, entscheidet sie, wo diese Abschnitte gelegt werden müssen und erstellt FIX UPs für diese temporären Adressen, so dass die Anweisungen, die in den Programmen beziehen sich auf die nun echten virtuellen Adressen auf die Globals verweisen Erinnerung.

Jetzt wissen Sie, was der .data Abschnitt / Bereich ist und warum brauchen die Globals etwas Platz in diesem Bereich zugeordnet werden und wie das hilft, das Programm in Echtzeit. PE-Format und Linker und .data Abschnitt usw. googeln würden Sie die Links erhalten.

ich denke, ‚Datenbereich‘ auf den Heap beziehen, während lokale Variablen in der Regel auf dem Stapel befinden würden.

Oder es bedeutet, dass der Speicher für diese Variable zugewiesen wird im .data Abschnitt der ausführbaren Datei befindet, aber das wäre spezifisch für Windows und das PE-Format.

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