2012-12-22 18 views
5

मुझे वीसी ++ (32 बिट और 64 बिट) में बहने वाले ढेर के बारे में सटीक जानकारी चाहिए, और विशेष रूप से रिकर्सन में। डीबग मोड में, यह जल्द ही रिकर्सन में होता है (जैसे कि 4500 एक साधारण रिकर्सिव फ़ंक्शन के चलते कुछ भी ऐसा नहीं करता है)। हालांकि, ऐसा लगता है कि रिलीज मोड अलग है। यह समझना मुश्किल था, और मैंने अब तक इसका परीक्षण नहीं किया, क्योंकि ऑप्टिमाइज़ेशन उस कोड को हटा देता है जो कुछ भी नहीं करता है (स्पष्ट रूप से रिकर्सन को हटा देता है), क्योंकि मेरा कोड या फ़ंक्शन ऐसा था .. मुझे और करना चाहिए .. मैं मापता हूं अनुकूलित रिलीज में सही समय, मुझे नहीं पता कि पुनरावृत्ति द्वारा कार्यान्वित किए गए अधिक जटिल त्वरित क्रम में अनुकूलन समान है या नहीं?वीसी ++ में ढेर का आकार क्या है?

धन्यवाद!

उत्तर

7

एंड्रियास Brinck states in his related answer के रूप में:

कुलपति ++ में डिफ़ॉल्ट ढेर आकार, 1 एमबी मुझे लगता है कि है, इसलिए 10.000 के प्रत्यावर्तन गहराई के साथ प्रत्येक ढेर फ्रेम सबसे ~ 100 बाइट्स पर हो सकता है।

परियोजना → गुण → विन्यास गुण → लिंकर → सिस्टम → ढेर रिजर्व आकार:

यह ढेर आकार सीमा का उपयोग कर संशोधित किया जा सकता।

Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.

+0

यह काम करता है, धन्यवाद, इसे कॉन्फ़िगरेशन के बाद पुनर्निर्माण की आवश्यकता है। धन्यवाद! – user683595

+0

आपका स्वागत है !! जवाब स्वीकार करना न भूलें। क्रिसमस की बधाई!! –

+0

पहला अनुच्छेद [सी/सी ++ प्रोग्राम के अधिकतम स्टैक आकार] से http://backoverflow.com/q/1825964) –

0

आप हर पुनरावर्ती एल्गोरिदम पुनरावृत्ति उदा कर सकते हैं एक अलग ढेर के साथ।

1

कुलपति में ढेर आकार ++ में स्थित है के लिए विकल्प,

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size. 
0

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

सुरक्षा के लिए, सुनिश्चित करें कि आप अधिकतम सुरक्षित रिकर्सन स्तर का परीक्षण करते हैं, और फिर आपके फ़ंक्शन में एक सीमा है [यहां तक ​​कि उत्पादन कोड में भी, भले ही यह इसे थोड़ा सा धीमा कर दे और संभवतः अधिक स्टैक स्पेस ले ले] । अन्यथा, आप शर्त लगा सकते हैं कि कोई, कहीं भी, आपके कोड का उपयोग उस तरीके से करेगा जिसकी आपने उम्मीद नहीं की थी, और जब आप अनुमान लगाते हैं तो रिकॉर्शन में कुछ स्तरों को गहरा कर दिया जाता है, तो कोई समस्या नहीं होती है।

एक और संभावित समाधान एक अलग थ्रेड में अपना रिकर्सन चलाने के लिए है, और यदि वह धागा दुर्घटनाग्रस्त हो जाता है, तो आपके पास अभी भी कुछ मुख्य तरीके से दुर्घटना से ठीक होने के लिए आपका मुख्य धागा है (यदि कुछ और नहीं, तो बस इस तथ्य को रिकॉर्ड करने के लिए कोड एक ढेर के साथ दुर्घटनाग्रस्त हो गया, और इसकी परिस्थितियों में क्या था)।

मैं निश्चित रूप से एक गैर-पुनरावर्ती, या कम से कम सीमित रिकर्सन स्तर होना पसंद करता हूं, और अन्य तंत्र का उपयोग करता हूं, जैसे कि "हम कहां हैं" रिकॉर्ड करने के लिए गतिशील रूप से आवंटित लियो डेटा संरचना।

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