9

스택이나 힙에서 기본 위젯을 초기화해야하는지 여부에 대해서는 다소 혼란 스럽습니다. "C++ GUI Programming with 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; 
} 

내가 일반적으로 스택 대 힙을 선택하여 패턴을 따라하는 것을 선호한다이 질문을 가지고 주된 이유 :

  • 그렇지 않으면
  • - -
  • 항목이 장기 인 경우 힙 - 항목이 큰 경우 스택

지금, 내 질문은 두 가지 질문으로 귀결 같아요

  • 는 QWidget 내가 스택 오버 플로우 두려워해야 할 점에 큰가요?
  • 평균 응용 프로그램의 스택 크기는 어느 정도입니까? 언제 스택 오버플로에 대해 두려워해야합니까 (분명히 재귀 함수 제외)?

QWidget 자체가 스택 오버플로를 일으킬 가능성은 거의 없다는 것을 알고 있지만, 물론 이것은 내 응용 프로그램에있을 수있는 다른 스택 사용량 위에있을 것입니다.

+0

개체의 크기를 보려면'sizeof'를 사용하십시오. "평균 스택 (average stack)"은 없으며 응용 프로그램마다 매우 다양하며 플랫폼에 따라 그 한계가 다양합니다. 걱정할 필요가 없으며, 추적하기 쉽고 성능 측면이 전혀 없으므로 힙을 사용하십시오. – Mat

+0

응용 프로그램에 따라 다양하다고 말하면 스택 사용을 의미한다고 가정하지만 사용 가능한 것은 무엇입니까? 응용 프로그램 당 평균을 찾는 대신, 지난 15 년 동안 Windows, Linux 또는 Mac 응용 프로그램의 최소 스택 크기는 얼마입니까? 기본적으로, 크로스 플랫폼 애플리케이션을 만드는 경우 어떤 제한이 필요한지 궁금합니다. --- sizeof는 20을 보여줍니다, 이것은 조금 정확 해 보입니다. – Serodis

+0

@ "stack"/ "heap" –

답변

3

힙과 대용을 선택하는 패턴이 적당하지만 나는 객체의 크기에 대해 크게 걱정하지 않을 것입니다. 큰 개체는 내부적으로 힙을 사용해야합니다. std :: vector는 일반적으로 세 포인터의 크기이지만 매우 클 수 있습니다.

어떤 개체가 스택 자체를 오버플로 할 정도로 충분히 두려워하지 않아야한다고 생각하지 않습니다. 가능한 한 확실히 아주 희소하다 (나는 1 개를 보지 않았다).

단순성에 대해서도 생각해보십시오. 힙에 로컬 변수를 할당 한 다음 함수가 반환되기 전에 해제 할 수는 있지만 불필요하게 복잡하고 일반적으로 나쁜 습관으로 간주 될 수 있습니다.

일반적으로 스택 크기는 링커 설정을 통해 구성됩니다. Windows에서는 기본적으로 1MB입니다.

+0

QMainWindow가 이와 같이 스택하는 것이 꽤 표준입니다. 그것은 평생 동안 그리고 독자에게 아주 명확한 것이 있다는 사실을 만든다. –

2

간단하게 짧은 코드를 제공하므로 스택 기반 방식을 사용하는 것을 선호합니다. 스택 오버플로에 대한 우려는 그럴듯하지만 그럴 가능성은 희박합니다. 내가 QApplicationMainWindow의 크기에 대한 생각이 없지만

, 그것은 (주로) 큰 크기를 필요로 내부 데이터 구조에 대한 힙을 사용합니다. 따라서 잠재적 인 스택 오버 플로우에 대해 그렇게 걱정할 필요가 없습니다.

일반적으로 Windows 응용 프로그램에는 1MB 크기의 스택이 있습니다. 그러나 링커 옵션을 변경하여 쉽게 변경할 수 있습니다 : /STACK.