ich habe mal eine ganz grundlegende Frage. Wenn ich mit Qt und C++ programmiere, muss ich das ja notgedrungen objektorientiert machen. Wenn ich also eine Klasse ChatDialog in chatdialog.h anlege und darin ein paar Variablen deklariere, kann ich das ja statisch machen (bspw. QLabel label;) oder dynamisch (Qlabel *label). Beim ersten Fall landet die Variable auf dem Stack im zweiten auf dem Heap. Soweit hab ich das verstanden. Aber worin liegt jetzt der praktische Unterschied für mich als Programmierer außer:
Die Terminologie "statisch" wurde ja schon zu recht hier kritisiert. Als Ergänzung möchte ich anmerken, dass Objekte, die mit
Qlabel label;
erzeugt werden, auch als "automatische Variablen" bezeichnet werden. Das ist insofern auch schlüssiger, als dass der Speicherbereich auf dem Stack beim Eintreten in die Funktion automatisch reserviert und beim Verlassen der Funktion automatisch wieder freigegeben wird. "Statische" Variablen in C/C++ sind eher jene mit dem vorangestellten Keyword 'static'.
Da der Stack nach der Ausführung der Funktion/Methode wieder automatisch bereinigt wird, werden statische Objekte also automatisch zerstört, wenn die Funktion bzw. Methode beendet ist.
Genau, _automatische_ Objekte werden automatisch zerstört... ;)
Beim Stack und beim Heap gibt es für den Programmierer ein paar praktische Unterschiede:
- Der Stack ist größenbegrenzt, und zwar i.d.R. deutlich kleiner als der zur Verfügung stehende Hauptspeicher. Das heißt, dass Dir eine Funktion wie
int f(int N) {
double array[N];
...
}
um die Ohren fliegt, sobald N einen (i.d.R. nicht allzugroßen) Grenzwert überschreitet. Demgegenüber kannst Du bei Allozierung mit malloc oder new auf dem Heap anhand des Rückgabewerts prüfen, ob die Speicherreservierung erfolgreich war und ggf. den Fehler abfangen.
- Der Stack ist 'schneller' als der Heap.
Der Zugriff auf Stack-Speicher ist meist erheblich schneller als auf Heap-Speicher. Grund: Die Stackbelegung ist meist nicht übermäßig groß, der Stack wird fast ständig benötigt und befindet sich daher mit hoher Sicherheit komplett im Prozessorcache. In der Praxis kann das bei Iterationsschleifen mit zahlreichen Variablen-Zugriffen im Vergleich Stack vs. Heap locker einen Faktor 2-3 oder mehr ausmachen.
Das ganze hängt natürlich stark davon ab, welche Prozessor- und Speicherhardware verwendet wird. Meine obigen Angaben beziehen sich auf heutige Standard-PCs, auf irgendwelchen exotischen Hardware-Plattformen kann das natürlich ganz anders aussehen.
Viele Grüße
Andreas