সি / সি ++ প্রোগ্রামের সর্বোচ্চ স্ট্যাক আকার


115

আমি 100 এক্স 100 অ্যারেতে ডিএফএস করতে চাই। (বলুন অ্যারের উপাদানগুলি গ্রাফ নোডগুলি উপস্থাপন করে) সুতরাং সবচেয়ে খারাপ পরিস্থিতি ধরে নিলে, পুনরাবৃত্ত ফাংশন কলগুলির গভীরতা প্রতিটি কল 20 বাইট পর্যন্ত নেওয়া সাথে সাথে 10000 পর্যন্ত যেতে পারে। সুতরাং এটি কি সম্ভাব্য উপায় মানে স্ট্যাকওভারফ্লো হওয়ার সম্ভাবনা আছে?

সি / সি ++ এ স্ট্যাকের সর্বাধিক আকার কত?


উইন্ডোজ
2) ইউনিক্সে সাইগউইন 1) উভয়ের জন্য দয়া করে জিসিসি নির্দিষ্ট করুন

সাধারণ সীমা কি?


11
আপনি কি জানেন যে আপনি পুনরাবৃত্তি ছাড়াই গভীরতা-প্রথম অনুসন্ধান প্রয়োগ করতে পারেন, তাই না?
সেবাস্তিয়ান

4
না আমি জানি না, দয়া করে ব্যাখ্যা করুন।
এডভোড

1
আমি আমার উত্তরে পুনরাবৃত্তি ছাড়াই ডিএফএসের একটি ছোট উদাহরণ তৈরি করেছি
আন্দ্রেস ব্রিনক

56
অতিরিক্ত স্ট্যাক ওভারফ্লো সম্পর্কে প্রশ্নের জন্য এক
স্যাম ওয়াটকিন্স

3
@ সামা ওয়াটকিনস হ্যাঁ, স্ট্যাক ওভারফ্লো নামে আমার কাছে সবচেয়ে বড় সমস্যা হ'ল আমি গুগলে "স্ট্যাক ওভারফ্লো" দেখতে পাব এবং এই ওয়েবসাইটটিতে শেষ হতে পারব, তবে স্ট্যাক ওভারফ্লো সম্পর্কে প্রশ্নে অগত্যা / কম সম্ভাবনা নেই ...
lalilulelost

উত্তর:


106

ভিজ্যুয়াল স্টুডিওতে ডিফল্ট স্ট্যাকের আকারটি আমার মনে হয় 1 এমবি, সুতরাং 10,000 এর পুনরাবৃত্তির গভীরতার সাথে প্রতিটি স্ট্যাক ফ্রেম সর্বাধিক ~ 100 বাইট হতে পারে যা ডিএফএস অ্যালগরিদমের জন্য পর্যাপ্ত হওয়া উচিত।

ভিজ্যুয়াল স্টুডিও সহ বেশিরভাগ সংকলক আপনাকে স্ট্যাকের আকার নির্দিষ্ট করতে দেয়। কিছু (সমস্ত?) লিনাক্স স্বাদে স্ট্যাকের আকার এক্সিকিউটেবলের অংশ নয় তবে ওএসে পরিবেশগত পরিবর্তনশীল। তারপরে আপনি স্ট্যাকের আকারটি চেক করতে পারেন ulimit -sএবং উদাহরণ সহ এটি একটি নতুন মানতে সেট করতে পারেন ulimit -s 16384

জিসিসির জন্য এখানে ডিফল্ট স্ট্যাক আকারের একটি লিঙ্ক রয়েছে।

পুনরাবৃত্তি ছাড়াই ডিএফএস:

std::stack<Node> dfs;
dfs.push(start);
do {
    Node top = dfs.top();
    if (top is what we are looking for) {
       break;
    }
    dfs.pop();
    for (outgoing nodes from top) {
        dfs.push(outgoing node);
    }
} while (!dfs.empty())

12
এবং কেবলমাত্র রেফারেন্সের জন্য, একটি বিএফএস সমান যা আপনি স্ট্যাকের পরিবর্তে একটি ফিফো ব্যবহার করেন।
স্টিভ জেসোপ

হ্যাঁ, বা এসটিএল-লিঙ্গোতে একটি std :: পপ_ফ্রন্ট / পুশ_ব্যাক সহ ডিউক ব্যবহার করুন
Andreas

স্ট্যাক ফলাফল সহ আপনার ডিএফএস পুনরাবৃত্তি সংস্করণ থেকে পৃথক হবে। কিছু ক্ষেত্রে এটি কিছু যায় আসে না, তবে অন্যদের মধ্যে (
উদাহরণস্বরূপ

হ্যাঁ, ভিএসের জন্য ডিফল্ট সীমাটি আসলে 1MB B : আরো তথ্য এবং একটি ভিন্ন মান সেট করার উপায় মাইক্রোসফট ডকুমেন্টেশন খুঁজে পাওয়া যেতে পারে msdn.microsoft.com/en-us/library/tdkhxaks(v=vs.140).aspx
FrankS101

আমি পুনরাবৃত্তির পরিবর্তে এই জাতীয় অ্যালগরিদমের জন্য একটি স্পষ্ট স্ট্যাক ডেটা কাঠামো ব্যবহার করতে পছন্দ করি, যাতে ১. সিস্টেম স্ট্যাকের আকারের উপর নির্ভর করে না, ২. অ্যালগরিদমকে কোনও ভিন্ন ডেটা কাঠামো যেমন, বিন্যাস বা অগ্রাধিকার সারি ব্যবহার না করে পরিবর্তন করতে পারে সমস্ত কোড আউট।
স্যাম ওয়াটকিন্স

47

থ্রেডগুলির জন্য স্ট্যাকগুলি প্রায়শই ছোট হয়। আপনি লিঙ্ক সময়ে ডিফল্ট পরিবর্তন করতে পারেন, বা রান সময় পরিবর্তন করতে পারেন। রেফারেন্সের জন্য কিছু ডিফল্ট হ'ল:

  • glibc i386, x86_64 7.4 এমবি
  • Tru64 5.1 5.2 এমবি
  • সাইগউইন 1.8 এমবি
  • সোলারিস 7..10 1 এমবি
  • MacOS এক্স 10.5 460 কেবি
  • এআইএক্স 5 98 কেবি
  • ওপেনবিএসডি 4.0 64 কেবি
  • এইচপি-ইউএক্স 11 16 কেবি


17

প্ল্যাটফর্ম-নির্ভর, সরঞ্জামচাঁই-নির্ভর, ulimit- নির্ভর, পরামিতি-নির্ভর .... এটি নির্দিষ্টভাবে নির্দিষ্ট নয়, এবং অনেকগুলি স্থিতিশীল এবং গতিশীল বৈশিষ্ট্য রয়েছে যা এটি প্রভাবিত করতে পারে।


4
কোনও "সাধারণ সীমাবদ্ধতা" নেই। উইন্ডোজে, ডিফল্ট ভিসি ++ লিঙ্কার অপশন এবং ডিফল্ট ক্রিয়েটথ্রেড আচরণ সহ, সাধারণত থ্রেডে প্রায় 1 এমআইবি প্রায় something সীমাহীন ব্যবহারকারীর সাথে লিনাক্সে আমি বিশ্বাস করি যে সাধারণত কোনও সীমা থাকে না (প্রায় পুরো ঠিকানা স্থান দখল করতে স্ট্যাকটি কেবল নীচের দিকে বাড়তে পারে)। মূলত, যদি আপনাকে জিজ্ঞাসা করতে হয়, আপনি স্ট্যাকটি ব্যবহার করা উচিত নয়।
ড্রিপিজা

1
এম্বেড থাকা সিস্টেমে আপনার 4k বা তারও কম থাকতে পারে। সেক্ষেত্রে স্ট্যাকটি ব্যবহার করা যুক্তিসঙ্গত হলেও আপনাকে জিজ্ঞাসা করতে হবে। উত্তরটি সাধারণত গ্যালিক শ্রাগ হয়।
স্টিভ জেসোপ

1
আহ্ সত্য, প্রায়শই কার্নেল মোডেও ঘটে।
ড্রিপাজা

6

হ্যাঁ, স্ট্যাকের ওভারফ্লো হওয়ার সম্ভাবনা রয়েছে। সি এবং সি ++ স্ট্যান্ডার্ড স্ট্যাক গভীরতার মতো জিনিসকে নির্দেশ করে না, এগুলি সাধারণত একটি পরিবেশগত সমস্যা।

বেশিরভাগ শালীন বিকাশ পরিবেশ এবং / অথবা অপারেটিং সিস্টেমগুলি আপনাকে কোনও লিঙ্ক বা লোডের সময় কোনও প্রক্রিয়াটির স্ট্যাকের আকারটি তৈরি করতে দেয়।

আপনি আরও ওষুধযুক্ত সহায়তার জন্য কোন ওএস এবং বিকাশের পরিবেশ ব্যবহার করছেন তা নির্দিষ্ট করা উচিত।

উদাহরণস্বরূপ, উবুন্টু কার্মিক কোয়ালার অধীনে, জিসিসির জন্য ডিফল্ট 2M সংরক্ষিত এবং 4 কে প্রতিশ্রুতিবদ্ধ হয় তবে আপনি প্রোগ্রামটি লিঙ্ক করলে এটি পরিবর্তন করা যেতে পারে। ব্যবহার--stack বিকল্পটিld


2
@ ল্লেক্স: কোনও সাধারণ সীমা নেই। এটি অনেকগুলি পরামিতিগুলির উপর নির্ভর করে।
মাইকেল ফৌকারাকিস

@ প্যাক্সডিয়াবলো: সংরক্ষিত ও প্রতিশ্রুত অর্থ কী?
এডভোড

2
সংরক্ষিত হ'ল কত ঠিকানার জায়গা বরাদ্দ করতে হবে, প্রতিশ্রুতিবদ্ধ হ'ল ব্যাকিং স্টোরেজটি কত সংযুক্ত করতে হবে committed অন্য কথায়, ঠিকানার জায়গার সংরক্ষণের অর্থ এই নয় যে আপনার যখন প্রয়োজন হবে তখন স্মৃতি থাকবে। আপনি যদি কখনও 4K এর বেশি স্ট্যাক ব্যবহার না করেন তবে আপনি অন্য 1.6M এর জন্য প্রকৃত স্মৃতি নষ্ট করছেন না। আপনি যদি গ্যারান্টি দিতে চান তবে পর্যাপ্ত পরিমাণে স্ট্যাক থাকবে, সংরক্ষিত এবং প্রতিশ্রুতিবদ্ধ হওয়া উচিত অভিন্ন should
paxdiablo

2
@ প্যাক্সিডিয়াবলো 2 এম - 4 কে 1.6 এম নয়। কথা মাত্র. (আমি আপনার মন্তব্যটি পড়ার জন্য আমাকে প্রথম তিনবার বিভ্রান্ত করেছিলাম)
গ্রিফিন

2
@ গ্রিফিন, 3+ বছরে প্রথম ব্যক্তির পক্ষে এটি কুডোস। আমি অবশ্যই "বাকী অংশ" বলতে
চাইছিলাম

5

আমি কর্মক্ষেত্রে কেবল স্ট্যাকের বাইরে চলে এসেছি, এটি একটি ডাটাবেস ছিল এবং এটি কিছু থ্রেড চালাচ্ছিল, মূলত পূর্ববর্তী বিকাশকারী স্ট্যাকের উপরে একটি বড় অ্যারে ফেলেছিল এবং স্ট্যাকটি যাইহোক কম ছিল। সফ্টওয়্যারটি মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2015 ব্যবহার করে সংকলিত হয়েছিল।

যদিও থ্রেডটি স্ট্যাকের বাইরে চলে গিয়েছিল, এটি নিঃশব্দে ব্যর্থ হয়েছিল এবং অবিরত ছিল, যখন স্ট্যাকের ডেটার সামগ্রীগুলি অ্যাক্সেস করতে আসে তখন এটি কেবল স্ট্যাক প্রবাহিত হয়।

আমি যে সর্বোত্তম পরামর্শ দিতে পারি তা হ'ল স্ট্যাকের অ্যারেগুলি ঘোষণা না করা - বিশেষত জটিল অ্যাপ্লিকেশনগুলিতে এবং বিশেষত থ্রেডগুলিতে, পরিবর্তে গাদা ব্যবহার করুন। এটি এর জন্য এখানেই রয়েছে;)

এছাড়াও কেবল মনে রাখবেন স্ট্যাকটি ঘোষণার সময় এটি অবিলম্বে ব্যর্থ হতে পারে না, তবে কেবল অ্যাক্সেসে। আমার অনুমান যে সংকলকটি উইন্ডোজের নীচে স্ট্যাকটিকে "আশাবাদী" হিসাবে ঘোষণা করে, অর্থাৎ এটি ধরে নেবে যে স্ট্যাকটি ঘোষিত হয়েছে এবং এটি ব্যবহার করার আগ পর্যন্ত পর্যাপ্ত আকারের হবে এবং তারপরে সন্ধান করবে যে স্ট্যাকটি সেখানে নেই।

বিভিন্ন অপারেটিং সিস্টেমে স্ট্যাকের ঘোষণার নীতি থাকতে পারে। এই নীতিগুলি কী তা জানা থাকলে দয়া করে একটি মন্তব্য দিন leave


3

একটি আয়তক্ষেত্রাকার অ্যারেতে গভীরতার সাথে প্রথম অনুসন্ধান করে আপনি কী বোঝাতে চেয়েছিলেন তা আমি নিশ্চিত নই, তবে আমি ধরে নিচ্ছি আপনি কী করছেন তা আপনি জানেন।

স্ট্যাকের সীমা যদি সমস্যা হয় তবে আপনার পুনরাবৃত্ত সমাধানটি পুনরাবৃত্ত সমাধানে রূপান্তর করতে সক্ষম হওয়া উচিত যা মধ্যবর্তী মানগুলিকে স্তূপ থেকে বরাদ্দ করা হয় p

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.