यह दृढ़ता से ऑपरेटिंग सिस्टम विशिष्ट (और कंप्यूटर विशिष्ट) है और कुछ ओएस पर आपके पास सीमा को कॉन्फ़िगर करने (और यहां तक कि) बढ़ाने के कुछ तरीके हैं। यह भी संकलक विशिष्ट (या आपकी प्रोग्रामिंग-भाषा-कार्यान्वयन विशिष्ट) है, क्योंकि कुछ संकलक ( कुछ सीमित प्रकार के सी कोड के लिए हाल के जीसीसी सहित ) कुछ पूंछ कॉल का अनुकूलन करने में सक्षम हैं ।
(कुछ प्रोग्रामिंग भाषा विनिर्देशों के लिए टेल कॉल ऑप्टिमाइज़ेशन की आवश्यकता होती है , जैसे R5RS )
मुझे यकीन नहीं है कि आपका सवाल समझ में आता है (और निश्चित रूप से आपकी 2 16 की सीमा नहीं)। मेरे लिनक्स डेस्कटॉप (डेबियन / सिड / x86-64, लिनक्स 4.9 कर्नेल, 32 जीबी रैम, इंटेल i5-4690S) पर, मेरे पास 8 मेगाबाइट तक का कॉल स्टैक हो सकता है (और मैं उस सीमा को बढ़ा सकता हूं, अगर मैं वास्तव में चाहता था। )।
मल्टी-थ्रेडिंग और एएसएलआर आपके प्रश्न को और अधिक जटिल बना रहे हैं । उदाहरण देखें pthread_attr_setstack (3) । विभाजन के ढेर के बारे में भी पढ़ें (अक्सर गो कार्यान्वयन द्वारा उपयोग किया जाता है ) और निरंतरता शैली के बारे में । इस उत्तर को भी देखें ।
इसके लायक क्या है, मैंने सिर्फ निम्नलिखित C99 (और C11) कोड की भी कोशिश की:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void recfun(int x, int d) {
printf("start recfun x=%d d=%d\n", x, d);
fflush(NULL);
if (d>0)
recfun(x+1, d-1);
printf("end recfun x=%d d=%d\n", x, d);
}
int main(int argc, char**argv) {
int md = argc>1?atoi(argv[1]):10000;
printf ("start md=%d\n", md);
recfun(0, md);
printf("end md=%d clock=%ld µs\n", md, clock());
}
// eof recur.c
और मैं उस recur
कार्यक्रम को चलाने में सक्षम था (जैसा कि जीसीसी 6 के साथ संकलित किया गया gcc -Wall -O recur.c -o recur
) recur 161000
(आपकी 2 16 की सीमा से अधिक)। इसके साथ recur 256000
ही काम भी किया। इसके साथ recur 456000
दुर्घटनाग्रस्त हो गया ( स्तर के लिए एक ढेर अतिप्रवाह के साथ x=272057
)। मेरे पास अन्य परीक्षणों के लिए धैर्य नहीं है। अपने कंप्यूटर पर कोशिश करें। अनुकूलन के लिए पूछना मत भूलना।
अंगूठे का एक नियम (डेस्कटॉप, लैपटॉप, टैबलेट के लिए) आपके कॉल स्टैक को एक मेगाबाइट से नीचे रखने के लिए हो सकता है।
भी पास करके -fstack-usage
करने के लिए gcc
मैं निम्नलिखित हो रही recur.su
फ़ाइल (संख्या, मेरे 8Mb ढेर सीमा अंतर्ज्ञान के साथ संगत बाइट्स में हैं, मत भूलना main
कॉल फ्रेम, और अधिक महत्वपूर्ण प्रारंभिक ढेर लेआउट, कर्नेल द्वारा स्थापित जब कर execve (2 ) ..., crt0 के लिए ):
recur.c:5:10:recfun 32 static
recur.c:13:9:main 16 static
पुनश्च। मेरे Arduino में केवल 2kbytes RAM के साथ एक Atmega328 है , इसलिए निश्चित रूप से वह इतना पुनरावृत्ति नहीं कर सकता है। मुझे लगता है कि केवल कुछ सैकड़ों स्टैक फ्रेम Arduinos पर व्यावहारिक रूप से संभव हैं।
here i mean by limit the maximum number of levels that can the stack have
एक स्तर क्या है?