2011-12-31 16 views
9

मैं थोड़ा उलझन में हूं कि मुझे अपने मुख्य विजेट को ढेर या ढेर पर प्रारंभ करना चाहिए या नहीं। क्यूटी 4 के साथ "सी ++ जीयूआई प्रोग्रामिंग" में, मुख्य विजेट स्टैक पर शुरू किए जाते हैं। इससे पहले कि मैं और अधिक कहते हैं, मैं समझा जाएगा कि मैं क्या मतलब है:क्यूटी - मुख्य विजेट - ढेर या ढेर?

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

अब, शायद यह सिर्फ इसलिए क्योंकि यह सुरक्षित है, शायद यह है क्योंकि वे क्यूटी में स्मृति आवंटन के बारे में पाठकों को भ्रमित नहीं करना चाहती है। 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' का उपयोग करें। कोई "औसत ढेर" नहीं है, यह अनुप्रयोगों के बीच व्यापक रूप से भिन्न होता है, और सीमाएं प्लेटफ़ॉर्म द्वारा व्यापक रूप से भिन्न होती हैं। यदि आप चिंतित हैं, और चूंकि यह ट्रैक करना आसान है और बिल्कुल कोई प्रदर्शन पहलू नहीं है, तो केवल ढेर का उपयोग करें। – Mat

+0

आप कहते हैं कि यह एप्लिकेशन द्वारा भिन्न है, मुझे लगता है कि आपका मतलब स्टैक-प्रयुक्त है, लेकिन उपलब्ध होने के बारे में क्या है। औसत प्रति एप्लिकेशन की तलाश करने के बजाय, पिछले 15 वर्षों में विंडोज, लिनक्स या मैक एप्लिकेशन के लिए न्यूनतम स्टैक-साइज क्या है? असल में, अगर मैं एक क्रॉस-प्लेटफ़ॉर्म एप्लिकेशन बना रहा हूं, तो मुझे उत्सुकता है कि मुझे किन सीमाओं की अपेक्षा करनी चाहिए। --- आकार 20 दिखाता है, यह सटीक है, जो थोड़ा सा लगता है। – Serodis

+0

उघ @ "स्टैक"/"हीप" –

उत्तर

3

ढेर बनाम स्टैक चुनने के लिए आपका पैटर्न उचित लगता है लेकिन मैं ऑब्जेक्ट के आकार के बारे में इतना चिंता नहीं करता। किसी भी बड़ी वस्तु को आंतरिक रूप से ढेर का उपयोग करना चाहिए। std :: वेक्टर आमतौर पर तीन पॉइंटर्स का आकार होता है लेकिन बहुत बड़ा हो सकता है।

मुझे नहीं लगता कि आपको डरना चाहिए कि किसी भी वस्तु को अपने आप को ढेर से बहने के लिए काफी बड़ा है। जबकि संभव है यह निश्चित रूप से बहुत दुर्लभ है (मैंने एक नहीं देखा है)।

मैं सादगी के बारे में सोचने की भी सिफारिश करता हूं, आप ढेर पर किसी भी स्थानीय चर आवंटित कर सकते हैं और फिर फ़ंक्शन रिटर्न से पहले इसे मुक्त कर सकते हैं, लेकिन यह अनावश्यक रूप से जटिल होगा और आमतौर पर खराब अभ्यास माना जाएगा।

स्टैक आकार आमतौर पर लिंकर सेटिंग्स के माध्यम से कॉन्फ़िगर किया जाता है। विंडोज़ पर यह डिफ़ॉल्ट रूप से 1 एमबी है।

+0

QMainWindow के लिए यह बहुत मानक है इस तरह ढेर होना। यह जीवन भर और तथ्य यह है कि पाठक को केवल एक ही स्पष्ट है –

2

मैं स्टैक-आधारित दृष्टिकोण का उपयोग करना पसंद करता हूं क्योंकि यह केवल संक्षिप्त कोड देता है। स्टैक ओवरफ़्लो के लिए आपकी चिंता व्यावहारिक होगी, लेकिन ऐसा होने की संभावना बहुत कम है।

हालांकि मुझे QApplication और MainWindow के आकार के बारे में कोई जानकारी नहीं है, लेकिन यह (अधिकतर) आंतरिक डेटा संरचनाओं के लिए ढेर का उपयोग करेगा जिसके लिए विशाल आकार की आवश्यकता होगी। इसलिए, आपको संभावित स्टैक ओवरफ़्लो के लिए बहुत चिंता करने की आवश्यकता नहीं है।

आमतौर पर, विंडोज अनुप्रयोगों में 1 एमबी स्टैक आकार होता है। लेकिन, आप आसानी से लिंकर विकल्प बदलकर बदल सकते हैं: /STACK

संबंधित मुद्दे