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ó.
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
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
Ugh @ "ngăn xếp"/"đống" –