Lebensdauer

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Deklarationen - Index

Die Begriff Lebensdauer ist eng mit der Speicherklasse verwandt und definiert den Zeitraum, in dem deklarierten Bezeichnern im Speicher reale, physische Objekte zugewiesen sind. Es wird zwischen Compilierungszeit- und Laufzeitobjekten unterschieden. Beispielsweise wird Variablen – im Gegensatz zu Objekten des Typs typedef und anderen Typen – während der Laufzeit realer Speicherplatz zugewiesen. Es gibt drei Arten der Lebensdauer: statisch, lokal, und dynamisch.

Statisch

Objekten mit statischer Lebensdauer wird Speicherplatz zugewiesen, sobald die Ausführung beginnt. Die Speicherplatzzuweisung bleibt bestehen, bis das Programm endet. Alle Funktionen – unabhängig davon, wo sie definiert werden – sind Objekte mit statischer Lebensdauer. Variablen mit dem Gültigkeitsbereich "Datei" besitzen ebenfalls eine statische Lebensdauer. Anderen Variablen kann durch die Zuweisung der Speicherklassen-Bezeichner static oder extern eine statische Lebensdauer zugeordnet werden.

Objekte mit statischer Lebensdauer werden auf Null gesetzt, wenn kein expliziter Initialisierer oder kein Klassenkonstruktor (in C++) vorhanden ist.

Statische Lebensdauer darf nicht mit dem Gültigkeitsbereich "Datei" oder "Global" verwechselt werden. Ein Objekt mit statischer Lebensdauer kann gleichzeitig einen lokalen Gültigkeitsbereich haben.

Lokal

Objekte mit lokaler Lebensdauer, auch als automatische Objekte bezeichnet, haben eine unsicherere Existenz. Sie werden auf dem Stack (oder in einem Register) angelegt, sobald das Programm in einen einschließenden Block oder in eine Funktion eintritt. Diese Objekte verlieren ihren Speicherplatz wieder, wenn das Programm die Funktion oder den Block verlässt. Objekte mit lokaler Lebensdauer müssen explizit initialisiert werden, andernfalls sind ihre Inhalte unvorhersehbar. Objekte mit lokaler Lebensdauer müssen immer einen lokalen Gültigkeitsbereich oder einen Funktionsgültigkeitsbereich haben. Der Speicherklassen-Bezeichner auto kann bei der Deklaration von Variablen mit lokaler Lebensdauer verwendet werden. Seine Verwendung ist aber normalerweise überflüssig, da auto für Variablen, die innerhalb von Blöcken deklariert sind, voreingestellt ist. Ein Objekt mit lokaler Lebensdauer hat einen lokalen Gültigkeitsbereich, weil es außerhalb des einschließenden Blocks nicht existiert. Das Umgekehrte trifft nicht zu: ein Objekt mit lokalem Gültigkeitsbereich kann eine statische Lebensdauer haben.

Bei der Deklaration von Variablen (zum Beispiel int, char, float) impliziert der Speicherklassen-Bezeichner register gleichzeitig auto; der Compiler wird jedoch aufgefordert, dem Objekt – wenn möglich – ein Register zuzuweisen. Der Compiler kann so eingestellt werden, dass einer lokalen Integer- oder Zeigervariablen immer ein Register zugewiesen wird, wenn dies möglich ist. Ist kein Register frei, wird die Variable ohne Warnung oder Fehlermeldung als lokales Objekt der Speicherklasse auto zugeordnet.

Anmerkung:  Der Compiler kann die Anforderung einer Registerzuweisung ignorieren. Registerzuweisung beruht auf der Analyse des Compilers über die Verwendung einer Variable.

Dynamisch

Objekte mit dynamischer Lebensdauer werden während eines Programms mit besonderen Funktionsaufrufen angelegt und wieder freigegeben. Die Speicherzuweisung erfolgt entweder über Standardbibliotheksfunktionen wie malloc oder mit dem C++ Operator new. Der zugewiesene Speicherplatz liegt in einem bestimmten Speicherbereich, dem sogenannten Heap. Mit free oder delete wird der Speicherplatz wieder freigegeben.

Siehe auch