فرق stack با heap - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۳۰۵ نفر آنلاین
۱۰۵ عضو و ۲۰۰ مهمان در سایت حاضرند

فرق stack با heap

+1 امتیاز
استاد ما یک مقاله اختیاری داده درباره Stack و Heap دوستان شما نظرتون راجع به این موارد چیه ؟!

فرق Stack با Heap چیه  ؟

از نظر سرعت دسترسی فرقی می کنن ؟

جا هایی پیدا میشه که بهتر باشه از Heap استفاده کرد یا بهتره همیشه از Stack استفاده کنیم ؟

آیا Stack یا Heap محدودیت فضای ذخیره سازی اطلاعات دارن ؟
سوال شده آذر 10, 1392  بوسیله ی پرپرپر (امتیاز 25)   2 2 5

3 پاسخ

+3 امتیاز
 
بهترین پاسخ
متغیرهایی که با کلمه کلیدی auto تعریف میشن تو استک قرار می گیرند این کلمه کلیدی اغلب استفاده نمی کنیم چون متغیر به صورت پیش فرض auto هستند.

استک در هنگام فراخوانی تابع جهت نگهداری آدرس برگشت جهت ، پارامترهای تابع ، متغیر های داخلی و همچنین ذخیره سازی register هایی که باید قبل بازگشت به حالت اول خودشون ست بشن مورد استفاده قرار می گیره. وقتی تابع را فراخوانی می کنید فضای برای استک اشغال میشه و وقتی خارج میشد آزاد میشه در فراخوانی تابع بعدی نیز همان فضای دوباره مورد استفاده قرار می گیره.استک کاراترین بخش حافظه هستش و محدوده مشخص که بارها بار استفاده میشه اگر شما با توجه به سایز cache آرایه خودتونو تعریف کنید به طور مشخص حافظه مربوط بهاستک در cache L1 آینه میشه. در ضمن برای استفاده بهینه از استک اگر توابع شما به نسبت حجیم هستند تا جای ممکن سعی کنید scope مربوط به متغیر ها را با {} محدود کنید چون بعضی از کامپایلر ها تا انتهای تابع حافظه متغیر را از استک خالی نمی کنند.

گاهی اوقات هم نیاز دارید که حافظه ای با سرعت استک و به صورت دینامیک داشته باشید که در این صورت می تونید از تابع alloca استفاده کنید این تابع بجای اینکه حافظه رو از heap بگیره از stack میگیره و در ضمن در انتهای تابع به صورت خودکار خودش آزاد میشه. از آنجایی که می دونید new و delete کلاک کمی هم مصرف نمی کنند ولی تابع alloca این سربارو نداره چون میکروپروسسور به صورت سخت افزاری استک را پشتیبانی می کنه و اگر چندین بار این تابع فراخوانی بشه دیگه fragment حافظه هم ندارید به خاطر طبیعت استک در ضمن کلاکی برای آزاد سازی هم مصرف نمیشه و در هنگام خروج به صورت خودکار خودش آزاد میشه و همچنین داده ها به صورت پیوسته در cache قرار می گیرند و data chaching هم به نحوه احسن انجام میشه .حواستون باشه که یک زمانی آدرسی اشاره گری که با تابع alloca اشغال کردید رو از تابع خارج نکنید چون بیرون تابع معتبر نیست.
پاسخ داده شده آذر 10, 1392 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد آذر 15, 1392 بوسیله ی BlueBlade
+1 امتیاز
تفاوتشون اینه که فضای Heap به فضای آزاد حافظه گفته میشه که طبیعاتاً شامل فضای بسیار بیشتری است ولی فضای stack segment محدود است که اطلاعات کمتری را می توان در آن قرار داد. مهمترین مشکلی که معمولاً در مورد stack رخ می دهد خطای stackOverflow است که معمولاً زمانی رخ می دهد که یک تابع بازگشتی را فراخوانی می کنیم. توجه داشته باشید که برای نگهداری داده ها و آدرس بازگشت توابع از فضای stack segment استفاده می شود و معمولاً از فضای heap برای نگهداری object ها استفاده میشه.
پاسخ داده شده آذر 10, 1392 بوسیله ی r0lex (امتیاز 391)   1 1 9
+1 امتیاز

همونطوری که دوستمون گفت هست .

از نظر سرعت دسترسی فرقی می کنن ؟

جا هایی پیدا میشه که بهتر باشه از Heap استفاده کرد یا بهتره همیشه از Stack استفاده کنیم ؟

هردوی این ها حافظه هستن و توی سرعت کاربرد فرقی ندارن .

تنها فرق سرعتشون توی اختصاص داده شدنشون هست .

Stack تندتر حافظه اختصاص میده تا Heap !

و هنگامی هم که شما چیزی ها رو به یک تابع میفرستید همه ی اونها توی پشته ریخته میشه و پس از اون تابع صدا زده میشه .

 

پاسخ داده شده آذر 10, 1392 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
سلام
دوست عزیز یک دلیل دیگه هم که  سرعت حافظه استک بیشتره به دلیل کم بودن فضای حافظشه و سرعت دسترسی
بالا میره
چرا اندازه heapو stackمتغیر است؟
...