9

Я немного смущен тем, предпочитаю ли я инициализировать свои главные виджеты в стеке или в куче. В «Программе программирования C++ GUI с QT 4» основные виджеты инициализируются в стеке. Прежде чем я скажу больше, я объясню, что я имею в виду:QT - Главный виджет - стек или куча?

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

Теперь, возможно, это просто потому, что это безопаснее, возможно, это происходит потому, что они не хотят, чтобы ввести в заблуждение читателей о распределении памяти в QT. Оставляя любые удаления объектов, наследуемых от QObject, безусловно, позволяет читателям «забыть» управление памятью с объектами QT. Но, на мой вопрос, мы должны предпочесть этот метод, или следующее:

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

Основная причина я приношу на этот вопрос, я обычно предпочитаю следовать шаблон с выбором кучи против стека:

  • Если элемент большой - Heap
  • Если деталь долгосрочный - Heap
  • в противном случае - Stack

Теперь, я думаю, мой вопрос сводится к двум вопросам:

  • Является QWidget большой до точки, где я должен бояться стек переполняется?
  • Насколько велик стек для среднего приложения? Когда я должен бояться переполнения стека (кроме явно рекурсивных функций)?

Я понимаю, что маловероятно, что QWidget вызывает переполнение стека, но, конечно же, это будет поверх любого другого использования стека, которое может иметь мое приложение.

+0

Используйте 'sizeof', чтобы узнать, насколько велик объект. Нет «среднего стека», он варьируется в широких пределах между приложениями, а ограничения сильно различаются по платформе. Если вы беспокоитесь, и так как это легко отслеживать, и нет абсолютно никакого аспекта производительности, просто используйте кучу. – Mat

+0

Вы говорите, что это зависит от приложения, я предполагаю, что вы имеете в виду используемый стек, но как насчет доступности. Как насчет того, чтобы искать среднее значение для каждого приложения, каков минимальный размер стека для приложений Windows, Linux или Mac за последние 15 лет? В принципе, если я создаю кросс-платформенное приложение, мне любопытно, какие ограничения я должен ожидать. --- sizeof показывает 20, это точная, что кажется немного маленьким. – Serodis

+0

Ugh @ "stack"/"heap" –

ответ

3

Ваш шаблон для выбора кучи и стека звучит разумно, но я бы не стал так беспокоиться о размере объекта. Любой крупный объект должен использовать кучу внутри. std :: vector обычно имеет размер трех указателей, но может быть очень большим.

Я не думаю, что вам следует опасаться, что любой объект достаточно велик, чтобы переполнить стек самостоятельно. Хотя возможно, это, конечно, очень редко (я его не видел).

Я бы рекомендовал подумать о простоте, вы могли бы выделить любую локальную переменную в куче, а затем освободить ее до возвращения функции, но это было бы излишне сложным и обычно считалось плохим.

Размер стека обычно настраивается с помощью настроек компоновщика. По умолчанию в Windows это 1 МБ.

+0

Это довольно стандартный для QMainWindow такой стек. Это делает жизнь и тот факт, что читателю только очень ясно –

2

Я предпочитаю использовать стековый подход, поскольку он просто дает короткий код. Ваша забота о переполнении стека будет правдоподобной, но вряд ли это произойдет.

Хотя у меня нет идеи для размера QApplication и MainWindow, он будет (в основном) использовать кучу для внутренних структур данных, требующих огромных размеров. Таким образом, вам не нужно беспокоиться о возможном переполнении стека.

Как правило, приложения Windows имеют размер стека 1 МБ. Но вы можете легко изменить, изменив вариант компоновщика: /STACK.

 Смежные вопросы

  • Нет связанных вопросов^_^