2011-12-31 13 views
9

Estoy un poco confundido sobre si preferiría inicializar mis widgets principales en la pila o en el montón. En "Programación de la GUI de C++ con QT 4," los widgets principales se inicializan en la pila. Antes de decir más, voy a explicar lo que quiero decir:QT - Widget principal - ¿Pila o pila?

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWin; 
    mainWin.show(); 
    return app.exec(); 
} 

Ahora, tal vez esto es simplemente porque es más seguro, tal vez es porque no quieren confundir a los lectores acerca de la asignación de memoria en QT. Al omitir cualquier eliminación en los objetos que se heredan de QObject, los lectores pueden "olvidar" la gestión de memoria con objetos QT. Sin embargo, mi pregunta es, ¿hay que prefieren ese método, o el siguiente:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow* mainWin = new MainWindow; 
    mainWin->show(); 
    int execReturn = app.exec(); 
    delete mainWin; 
    return execReturn; 
} 

La razón principal por la que trae esta pregunta es que normalmente prefiero seguir un patrón con la elección del montón vs pila:

  • Si el artículo es grande - Montón
  • Si el artículo es a largo plazo - Montón
  • De lo contrario - Pila

Ahora, supongo que mi pregunta se reduce a dos preguntas:

  • Es QWidget grande hasta el punto en que debería temer apilar-desbordamientos?
  • ¿Qué tan grande es la pila para la aplicación promedio? ¿Cuándo debería temer desbordar la pila (aparte de las funciones obviamente recursivas)?

Me doy cuenta de que es poco probable que QWidget cause un desbordamiento de la pila, pero, por supuesto, estará encima de cualquier otro uso de pila que pueda tener mi aplicación.

+0

Usa 'sizeof' para ver qué tan grande es el objeto. No existe una "pila promedio", varía ampliamente entre aplicaciones, y los límites varían ampliamente según la plataforma. Si está preocupado, y dado que este es fácil de seguir y no hay absolutamente ningún aspecto de rendimiento, simplemente use el montón. – Mat

+0

Dices que varió según la aplicación, supongo que te refieres a la pila utilizada, pero ¿qué hay de disponible? ¿Qué tal, en lugar de buscar un promedio por aplicación, cuál es el tamaño de pila mínimo para una aplicación de Windows, Linux o Mac en los últimos 15 años? Básicamente, si estoy creando una aplicación multiplataforma, tengo curiosidad por saber qué límites debo esperar. --- sizeof muestra 20, es esto exacto, parece un poco pequeño. – Serodis

+0

Ugh @ "stack"/"heap" –

Respuesta

3

Su patrón para elegir montón vs pila suena razonable, pero no me preocupe tanto por el tamaño del objeto. Cualquier objeto grande debería usar el montón internamente. std :: vector suele tener el tamaño de tres punteros, pero puede ser muy grande.

no creo que usted debe temer que cualquier objeto es lo suficientemente grande como para desbordar la pila por sí mismo. Si bien es posible, es muy raro (no he visto ninguno).

Yo recomendaría pensar en la simplicidad también, podría asignar cualquier variable local en el montón y luego liberarla antes de que la función regrese, pero esto sería innecesariamente complicado y generalmente se considera una mala práctica.

Tamaño de la pila está configurado generalmente a través de la configuración de engarce. En Windows, es 1MB por defecto.

+0

Es bastante estándar que QMainWindow se acumule de esta manera. Hace que la vida y el hecho de que haya solo una muy clara para el lector –

2

yo prefiero usar el enfoque basado en la pila ya que simplemente da código corto. Su preocupación por el desbordamiento de la pila sería plausible, pero es muy poco probable que suceda.

Aunque no tengo idea para el tamaño de QApplication y MainWindow, usará (en su mayoría) el montón para las estructuras internas de datos que requieren un gran tamaño. Por lo tanto, no necesita preocuparse tanto por el posible desbordamiento de pila.

Normalmente, las aplicaciones de Windows tienen tamaño de la pila de 1 MB. Sin embargo, puede cambiar fácilmente cambiando la opción del vinculador: /STACK.