QT - Haupt-Widget - Stack oder Heap?

9

Ich bin etwas verwirrt darüber, ob ich lieber meine Haupt-Widgets auf dem Stack oder auf dem Heap initialisieren möchte. In "C ++ - GUI-Programmierung mit QT 4" werden Hauptwidgets auf dem Stapel initialisiert. Bevor ich mehr sage, werde ich erklären, was ich meine:

%Vor%

Nun, vielleicht liegt das einfach daran, dass es sicherer ist, vielleicht weil sie die Leser nicht über die Speicherzuweisung in QT verwirren wollen. Das Weglassen von Löschungen auf Objekte, die von QObject erben, erlaubt es den Lesern sicherlich, die Speicherverwaltung mit QT-Objekten zu "vergessen". Aber meine Frage ist, sollten wir diese Methode oder das Folgende bevorzugen:

%Vor%

Der Hauptgrund, warum ich diese Frage stelle, ist, dass ich normalerweise einem Muster bei der Auswahl von Heap vs stack folge:

  • Wenn der Artikel groß ist - Heap
  • Wenn der Artikel langfristig ist - Heap
  • Andernfalls - Stapel

Nun, meine Frage läuft auf zwei Fragen hinaus:

  • Ist QWidget so groß, dass ich Stack-Overflows befürchten muss?
  • Wie groß ist der Stack für die durchschnittliche Anwendung? Wann sollte ich befürchten den Stack überlaufen zu lassen (andere als offensichtlich rekursive Funktionen)?

Mir ist klar, dass es unwahrscheinlich ist, dass QWidget selbst einen Stack-Overflow verursacht, aber natürlich wird dies über jede andere Stack-Nutzung meiner Anwendung hinausgehen.

    
Serodis 31.12.2011, 15:36
quelle

2 Antworten

3

Ihr Muster für die Auswahl von Heap vs Stack klingt vernünftig, aber ich würde mir nicht so viele Gedanken über die Größe des Objekts machen. Jedes große Objekt sollte den Heap intern verwenden. std :: vector ist normalerweise die Größe von drei Zeigern, kann aber sehr groß sein.

Ich glaube nicht, dass Sie befürchten müssen, dass ein Objekt groß genug ist, um den Stapel selbst zu überlaufen. Obwohl es möglich ist, ist es sicherlich sehr selten (ich habe noch keins gesehen).

Ich würde empfehlen, auch über die Einfachheit nachzudenken, Sie könnten jede lokale Variable auf dem Heap zuweisen und dann freigeben, bevor die Funktion zurückkehrt, aber dies wäre unnötig kompliziert und wird allgemein als schlechte Praxis angesehen.

Die Stapelgröße wird normalerweise über Linker-Einstellungen konfiguriert. Unter Windows ist es standardmäßig 1 MB.

    
Nikola Smiljanić 31.12.2011, 16:02
quelle
2

Ich bevorzuge den Stack-basierten Ansatz, da er einfach nur einen kurzen Code enthält. Ihre Sorge um Stapelüberlauf wäre plausibel, aber es ist sehr unwahrscheinlich, dass dies geschieht.

Obwohl ich keine Idee für die Größe von QApplication und MainWindow habe, wird (meistens) Heap für interne Datenstrukturen verwendet, die eine große Größe benötigen. Sie müssen sich also nicht so viele Sorgen wegen eines möglichen Stack-Überlaufs machen.

Windows-Anwendungen haben in der Regel eine Größe von 1 MB. Sie können dies jedoch leicht ändern, indem Sie die Linker-Option ändern: / STACK .

    
minjang 31.12.2011 15:59
quelle