2010-01-28 12 views
9

मैंने 1024bytes से अधिक आकार के सी में एक स्ट्रक्चर चर घोषित किया। चलने वाले कवर (एक स्थिर कोड विश्लेषक अनुप्रयोग) पर यह रिपोर्ट करता है कि यह स्टैक वैरिएबल 1024 बाइट से अधिक है और इसलिए त्रुटि का कारण है। मैं जानना चाहता हूं कि मुझे इस चेतावनी के बारे में चिंता करने की ज़रूरत है या नहीं? क्या वास्तव में एकल स्टैक वैरिएबल के आकार की अधिकतम सीमा है?क्या एक चर के आकार की अधिकतम सीमा है जिसे स्टैक पर आवंटित किया जाना चाहिए?

धन्यवाद, चे

+0

चुनने 1024 पूरी तरह से मनमाना है, एक 512 बाइट चर भी एक "त्रुटि के कारण" हो सकता है। और 2048 बाइट वेरिएबल इसे दो बार संभव नहीं बनाता है। इस सलाह को नमक के पाउंड से लें। –

उत्तर

3

एक चर का अधिकतम आकार ढेर (का अधिकतम आकार के द्वारा सीमित है विशेष रूप से, ढेर के कितना चर और मानकों कार्यों उच्च सहित किसी भी वर्तमान उपयोग से बचे है ढेर के साथ ही प्रक्रिया फ्रेम ओवरहेड पर)।

विंडोज़ पर, पहले धागे का ढेर निष्पादन योग्य set during linking की संपत्ति है जबकि थ्रेड के ढेर thread creation के दौरान निर्दिष्ट किया जा सकता है।

यूनिक्स पर, पहले धागे के stacksize आमतौर पर केवल केवल कितना कमरा है वहाँ यह विकसित करने के लिए द्वारा सीमित है। इस बात पर निर्भर करता है कि कैसे विशेष लिनक्स मेमोरी और साझा वस्तुओं का उपयोग करता है, जो भिन्न हो सकता है। thread creation के दौरान थ्रेड का ढेर भी निर्दिष्ट किया जा सकता है।

2

समस्या से क्योंकि विभिन्न निष्पादन रास्तों में से, अतिप्रवाह ढेर है आप को बचाने की कोशिश की है, यह परीक्षण में खोजने के लिए बहुत कठिन है। अधिकतर इस कारण से - इसे ढेर पर बड़ी मात्रा में डेटा आवंटित करने के लिए खराब रूप माना जाता है। यद्यपि आप केवल एक एम्बेडेड सिस्टम पर एक राल समस्या में भागने की संभावना है।

दूसरे शब्दों में, यह क्या यह ढेर पर बहुत अधिक डेटा समझता एक मनमाना सीमा निर्धारित करता है।

1

यह लेख बहुत ढेर आकार के बारे में दिलचस्प http://www.embedded.com/columns/technicalinsights/47101892?_requestid=27362

हाँ है यह ओएस पर निर्भर है और भी अन्य बातें निर्भर। बहुत अस्पष्ट होने के लिए खेद है। आप स्टैक आकार का परीक्षण करने के लिए जीसीसी संग्रह में कुछ कोड खोदने में भी सक्षम हो सकते हैं।

2

हां। बेशक यह आपके सिस्टम की पता स्थान से सीमित है। यह भी स्थान की मात्रा अपने ओएस, जो आमतौर पर अपने कार्यक्रम प्रारंभ होने के बाद बदला नहीं जा सकता लेकिन पहले से बदला जा सकता है (या तो शुरू प्रक्रिया के द्वारा, या निष्पादन के गुणों के द्वारा) द्वारा ढेर करने के लिए आवंटित द्वारा सीमित है। एक त्वरित नज़र में, मेरे ओएस एक्स सिस्टम पर अधिकतम स्टैक आकार 8 एमआईबी है और लिनक्स पर यह 10 एमआईबी है। कुछ प्रणालियों पर, आप शुरू होने वाले प्रत्येक अलग-अलग धागे को अलग-अलग स्टैक आवंटित भी कर सकते हैं, हालांकि यह सीमित उपयोगिता है। अधिकांश कंपाइलरों के पास एक और सीमा होती है कि वे एक स्टैक फ्रेम में कितना अनुमति देंगे।

एक आधुनिक डेस्कटॉप पर, मैं एक 1k ढेर आवंटन के बारे में चिंता नहीं करता जब तक कि समारोह पुनरावर्ती थे। यदि आप ओएस कर्नेल के अंदर उपयोग के लिए एम्बेडेड कोड या कोड लिख रहे हैं, तो यह एक समस्या होगी। कॉन्फ़िगरेशन विकल्पों के आधार पर लिनक्स कर्नेल में कोड केवल 64 कीबी स्टैक या उससे कम की अनुमति है।

+0

"कुछ सिस्टम पर, आप भी, प्रत्येक अलग धागा आप शुरू करने के लिए ढेर का एक अलग राशि आवंटित कर सकते हैं, हालांकि यह सीमित है"। यह सिस्टम पर उपयोगी बन जाता है जहां डिफ़ॉल्ट छोटे है - आप डेस्कटॉप लिनक्स पर जरूरत नहीं दिख रहा है, लेकिन आप पहले से आवंटित ढेर और कोई आभासी स्मृति के साथ कुछ एम्बेडेड सिस्टम पर करते हैं। –

0

यदि आपका फ़ंक्शन रिकर्सन में सीधे (अप्रत्यक्ष रूप से) शामिल था, तो स्टैक पर बड़ी मात्रा आवंटित करने से रिकर्सन की गहराई सीमित हो जाएगी और स्टैक को अच्छी तरह से उड़ाया जा सकता है। विंडोज के तहत यह स्टैक रिजर्व 1 एमबी तक डिफ़ॉल्ट है, हालांकि आप इसे लिंकर कमांड के साथ स्थिर रूप से बढ़ा सकते हैं। ढेर बढ़ने के साथ ही बढ़ेगा, लेकिन ऑपरेटिंग सिस्टम कभी-कभी इसे बढ़ा नहीं सकता है। मैं अपनी वेबसाइट here पर थोड़ा और विस्तार से इसकी चर्चा करता हूं।

0

मैंने देखा है के रूप में, एक सी संकलक (टर्बो) एक चर के लिए 64000k का अधिकतम आकार प्रदान करता है। अगर हमें अधिक आकार की आवश्यकता है, तो इसे "विशाल" घोषित किया जाता है।

+0

वही संदेश मैंने देखा है जब मैंने एक चर [1000] [1000] के रूप में एक चर घोषित किया था। कंपाइलर ने एक त्रुटि संदेश प्रदर्शित किया कि "सरणी आकार बहुत बड़ा" है। जब मैंने मदद देखी, तो उसे एक ही संदेश दिया गया –

0

यह एक अच्छा विचार ढेर अंतरिक्ष के एक बड़े पैमाने पर राशि का उपयोग करने के लिए प्रयास करने के लिए नहीं है।

यहाँ डिफ़ॉल्ट जीसीसी ढेर आकार के लिए एक लिंक है: http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

इसके अलावा, आप ढेर आकार अनुकूलित करने के लिए --stack,xxxxx निर्दिष्ट कर सकते हैं, तो यह मान xxxxx एक छोटी संख्या है और ढेर आवंटन के साथ रहना सबसे अच्छा है।

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