এটি দৃ strongly়ভাবে অপারেটিং সিস্টেম নির্দিষ্ট (এবং কম্পিউটার নির্দিষ্ট) এবং কিছু ওএসে আপনার সীমাটি কনফিগার করার (এবং এমনকি বৃদ্ধি) কিছু উপায় রয়েছে। এটি এমনকি সংকলক নির্দিষ্ট (বা আপনার প্রোগ্রামিং-ভাষা-বাস্তবায়ন নির্দিষ্ট), যেহেতু কিছু সংকলক ( কিছু সীমিত ধরণের সি কোডের জন্য সাম্প্রতিক জিসিসি সহ ) কিছু টেল কল অনুকূলিত করতে সক্ষম ।
(কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজ স্পেসিফিকেশনগুলির জন্য টেল কল অপ্টিমাইজেশানগুলি প্রয়োজন, যেমন আর 5 আরএস )
আমি নিশ্চিত না যে আপনার প্রশ্নটি বোধগম্য হয়েছে (এবং অবশ্যই আপনার 2 16 সীমা নয়)। আমার লিনাক্স ডেস্কটপে (ডিবিয়ান / সিড / x86-64, লিনাক্স 4.9 কার্নেল, 32 জিবি র্যাম, ইন্টেল আই 5-4690 এস) আমার কল স্ট্যাক 8 মেগাবাইট পর্যন্ত থাকতে পারে (এবং যদি আমি সত্যিই চাইতাম তবে আমি এই সীমাটি বাড়িয়ে দিতে পারি) )।
মাল্টি-থ্রেডিং এবং এএসএলআর আপনার প্রশ্নকে আরও জটিল করে তুলছে । উদাহরণস্বরূপ দেখুন pthread_attr_setstack (3) । সম্পর্কে আরো পড়ুন বিভক্ত স্ট্যাকগুলি (প্রায়ই দ্বারা ব্যবহৃত যান বাস্তবায়নের) এবং প্রায় ধারাবাহিকতা ক্ষণস্থায়ী শৈলী । আরও দেখুন এই উত্তর।
এটির মূল্যের জন্য, আমি কেবল নিম্নলিখিত সি 99 (এবং সি 11) কোডটিও চেষ্টা করেছি:
#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 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 টি Atmega328 , RAM এর শুধুমাত্র 2Kbytes যাতে অবশ্যই যে কত আবৃত্ত করতে পারবে না। আমার ধারণা, আরডুইনোসে কেবল কয়েক শতাধিক স্ট্যাক ফ্রেম সর্বাধিক ব্যবহারিকভাবে সম্ভব।
here i mean by limit the maximum number of levels that can the stack have
কি স্তর?