2011-12-31 29 views
9

Tôi hơi bối rối về việc liệu tôi có nên khởi tạo các tiện ích chính của mình trên ngăn xếp hoặc trên heap hay không. Trong "Lập trình GUI C++ với QT 4", các tiện ích chính được khởi tạo trên ngăn xếp. Trước khi tôi nói nhiều hơn, tôi sẽ giải thích ý tôi là:QT - Widget chính - Stack hoặc Heap?

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

Bây giờ, có lẽ điều này đơn giản vì nó an toàn hơn, có lẽ vì họ không muốn gây nhầm lẫn cho người đọc về phân bổ bộ nhớ trong QT. Để lại bất kỳ xóa trên các đối tượng kế thừa từ QObject chắc chắn không cho phép người đọc "quên" quản lý bộ nhớ với các đối tượng QT. Nhưng, câu hỏi của tôi là, chúng ta nên thích phương pháp đó, hoặc điều sau đây:

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

Lý do chính tôi mang câu hỏi này là tôi thường thích làm theo một mô hình với lựa chọn đống vs stack:

  • Nếu tài liệu là lớn - Heap
  • Nếu tài liệu là dài hạn - Heap
  • Nếu không - stack

Bây giờ, tôi đoán câu hỏi của tôi nắm để hai câu hỏi:

  • là QWidget lớn tới điểm mà tôi nên sợ chồng-tràn?
  • Ngăn xếp lớn cho ứng dụng trung bình là bao nhiêu? Khi nào tôi nên lo sợ cho việc tràn ngăn xếp (Khác với các hàm đệ quy rõ ràng)?

Tôi nhận thấy có khả năng QWidget không gây ra tình trạng tràn ngăn xếp, nhưng tất nhiên điều này sẽ nằm trên bất kỳ ứng dụng nào khác mà ứng dụng của tôi có thể có.

+0

Sử dụng 'sizeof' để xem đối tượng lớn như thế nào. Không có "stack trung bình", nó thay đổi rất nhiều giữa các ứng dụng và các giới hạn khác nhau tùy theo nền tảng. Nếu bạn đang lo lắng, và vì điều này dễ dàng theo dõi và hoàn toàn không có khía cạnh hiệu suất, chỉ cần sử dụng heap. – Mat

+0

Bạn nói nó thay đổi theo ứng dụng, tôi giả sử bạn có nghĩa là ngăn xếp sử dụng, nhưng những gì về có sẵn. Thay vì tìm kiếm trung bình mỗi ứng dụng, kích thước ngăn xếp tối thiểu cho ứng dụng Windows, Linux hoặc Mac trong 15 năm qua là bao nhiêu? Về cơ bản, nếu tôi đang tạo một ứng dụng đa nền tảng, tôi tò mò muốn giới hạn những gì. --- sizeof cho thấy 20, là chính xác, có vẻ như một chút nhỏ. – Serodis

+0

Ugh @ "ngăn xếp"/"đống" –

Trả lời

3

Mẫu của bạn để chọn heap và ngăn xếp âm thanh hợp lý nhưng tôi sẽ không lo lắng quá nhiều về kích thước của đối tượng. Bất kỳ đối tượng lớn nào cũng nên sử dụng heap trong nội bộ. std :: vector thường là kích thước của ba con trỏ nhưng có thể rất lớn.

Tôi không nghĩ bạn nên lo sợ rằng bất kỳ đối tượng nào đủ lớn để tự mình tràn ngăn xếp. Trong khi có thể nó chắc chắn là rất hiếm (tôi đã không nhìn thấy một).

Tôi khuyên bạn nên suy nghĩ về sự đơn giản, bạn có thể phân bổ bất kỳ biến cục bộ nào trên heap và sau đó giải phóng nó trước khi hàm trả về, nhưng điều này sẽ phức tạp một cách không cần thiết và thường được coi là thực hành không tốt.

Kích thước ngăn xếp thường được định cấu hình thông qua cài đặt trình liên kết. Trên Windows, nó là 1MB theo mặc định.

+0

Nó khá chuẩn cho QMainWindow để được xếp chồng như thế này. Nó làm cho cuộc đời và thực tế là chỉ có một người rất rõ ràng cho người đọc –

2

Tôi thích sử dụng phương pháp dựa trên ngăn xếp vì nó chỉ đơn giản là cung cấp mã ngắn. Mối quan tâm của bạn cho tràn ngăn xếp sẽ là chính đáng, nhưng nó rất khó xảy ra.

Mặc dù tôi không có ý tưởng về kích thước của QApplicationMainWindow, nó sẽ (chủ yếu) sử dụng đống cho cấu trúc dữ liệu nội bộ yêu cầu kích thước lớn. Vì vậy, bạn không cần phải lo lắng nhiều cho tràn ngăn xếp tiềm năng.

Thông thường, các ứng dụng Windows có kích thước ngăn xếp 1MB. Tuy nhiên, bạn có thể dễ dàng thay đổi bằng cách thay đổi tùy chọn trình liên kết: /STACK.

Các vấn đề liên quan