/tmp

TODO
يكشنبه, ۷ خرداد ۱۳۹۱، ۱۱:۱۴ ق.ظ

Stack را بزرگ تر کنید

Stack یا پشته نوع داده ای است که برای انباشتن و ذخیره ی اطلاعات استفاده می شود. در این ساختار آخرین داده هایی که ذخیره شده اند اول خوانده می شود.

برای مثال هنگامی که یک تابع می بازگشتی می نویسید از یک Stack استفاده می کنید که ترتیب اجرا شدن تابع را مشخص می کند. حال وقتی بیش از اندازه یک تابع را صدا بزنید، Stack دیگر پر شده و نمی تواند چیزی اضافه کند. در این شرایط با خطای Stack over flow مواجه خواهید شد.

این برنامه ی خیلی ساده Stack over flow می گیرد:

#include <iostream>
using namespace std;
int main()
{
       main();
}

حالا من اومدم یه تغییر کوچک تو برنامه دادم که ببینم این اتفاق چند بار می افته:

#include <iostream>
using namespace std;
long long i = 0;
int main()
{
       i ++;
       main();
}

من این برنامه رو با MS C++ (کامپایلر مایکروسافت برای C++) کامپایل و اجرا کردم و مقدار i بیشتر از 61000 نشد.

ولی در C++ این قابلیت وجود داره که Stack رو بزرگ تر کنید. این کار رو می تونید در MS C++ انجام بدید. در GNU C++ با این روش نمیشه این کارو کرد. برای این کار می تونید از این دستور استفاده کنید:

#pragma comment(linker, "/STACK:16777216")

با این دستور می توانید اندازه Stack را تغییر دهید. برای مثال در مثال بالا اندازه Stack به 16 مگابایت تغییر می کند.

برای امتحان این قضیه برنامه را به این شکل تغییر می دیم:

#pragma comment(linker, "/STACK:16777216")
#include <iostream>
using namespace std;
long long i = 0;
int main()
{
       i ++;
       if (i % 1000 == 0)
              cout << i << endl;
       main();
}

دراین شرایط i تا 836000 می رسد و پس از آن با خطای Stack over flow مواجه می شویم. این قابلیت می تواند کاربرد خیلی زیادی برای هنگامی که از یک الگوریتم بازگشتی برای یک داده ی بزرگ استفاده می کنیم، داشته باشد.

مراجع: ++



نوشته شده توسط شایان حسینی
ساخت وبلاگ در بلاگ بیان، رسانه متخصصان و اهل قلم

/tmp

TODO
/tmp

آخرین مطالب

  • ۹۰/۱۲/۲۶
    DOS
  • ۹۰/۱۰/۳۰
    Vim

Untitled

Fedora 17!
۰۷خرداد

Stack را بزرگ تر کنید

يكشنبه, ۷ خرداد ۱۳۹۱، ۱۱:۱۴ ق.ظ

Stack یا پشته نوع داده ای است که برای انباشتن و ذخیره ی اطلاعات استفاده می شود. در این ساختار آخرین داده هایی که ذخیره شده اند اول خوانده می شود.

برای مثال هنگامی که یک تابع می بازگشتی می نویسید از یک Stack استفاده می کنید که ترتیب اجرا شدن تابع را مشخص می کند. حال وقتی بیش از اندازه یک تابع را صدا بزنید، Stack دیگر پر شده و نمی تواند چیزی اضافه کند. در این شرایط با خطای Stack over flow مواجه خواهید شد.

این برنامه ی خیلی ساده Stack over flow می گیرد:

#include <iostream>
using namespace std;
int main()
{
       main();
}

حالا من اومدم یه تغییر کوچک تو برنامه دادم که ببینم این اتفاق چند بار می افته:

#include <iostream>
using namespace std;
long long i = 0;
int main()
{
       i ++;
       main();
}

من این برنامه رو با MS C++ (کامپایلر مایکروسافت برای C++) کامپایل و اجرا کردم و مقدار i بیشتر از 61000 نشد.

ولی در C++ این قابلیت وجود داره که Stack رو بزرگ تر کنید. این کار رو می تونید در MS C++ انجام بدید. در GNU C++ با این روش نمیشه این کارو کرد. برای این کار می تونید از این دستور استفاده کنید:

#pragma comment(linker, "/STACK:16777216")

با این دستور می توانید اندازه Stack را تغییر دهید. برای مثال در مثال بالا اندازه Stack به 16 مگابایت تغییر می کند.

برای امتحان این قضیه برنامه را به این شکل تغییر می دیم:

#pragma comment(linker, "/STACK:16777216")
#include <iostream>
using namespace std;
long long i = 0;
int main()
{
       i ++;
       if (i % 1000 == 0)
              cout << i << endl;
       main();
}

دراین شرایط i تا 836000 می رسد و پس از آن با خطای Stack over flow مواجه می شویم. این قابلیت می تواند کاربرد خیلی زیادی برای هنگامی که از یک الگوریتم بازگشتی برای یک داده ی بزرگ استفاده می کنیم، داشته باشد.

مراجع: ++

نظرات  (۴)

 مرسی
پاسخ:
خواهش .
والا من که هر وقت اومدیم اینجا هیچی حالیم نشد!

ولی خسته نباشی!
پاسخ:
سلامت باشی هادی جان!
 خیلی عالی بود
ممنون
پاسخ:
خواهش.
۳۱ خرداد ۹۱ ، ۲۱:۵۱ عرفان علی محمدی
1) تا حالا با pragma کار نکردم!
2) لطفاً لینکم رو درست کن!
http://opso.ir
ممنون.
پاسخ:
چشم!

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی