أول مرة هنا ؟ تفحص قواعد المشاركة و معلومات أخرى عن عرب overflow!
x

ما هي ذاكرة ال call stack ؟؟

+2 صوت
205 مشاهدات

ما هي ذاكرة ال call stack ؟؟ واين توجد وعلى اي اساس يتم تحديد مساحتها وهل هي محجوزة دائما (لا يمكن استعاملها للأغراض العامة للرام) ؟

2 إجابة

+4 صوت

ال stack هى مكان يتم حجزه فى ال ram لحفظ بيانات معينة , سوف نتحدث عنها لاحقاً.

الستاك تتبع مبدأ FILO first in last out أى ان أول بيان تم دخوله هو اخر من يخرج .

كيف تعمل :- يوجد مؤشر يسمى ال stack pointer و هو يشاور على المكان التالى الفارغ فى ال stack

عندما تنادى على دالة فى برنامج و ترسل لها عدد معين من المتغيرات يتم حفظ هذه المتغيرات فى ال stack و أيضا حفظ المكان الذى ناديت منه على هذه الدالة و عند الانتهاء تقوم ال control unit باخراج اهذه المتغيرات منها و العودة الى العنوان ( المكان ) الذى تم النداء عليه للدالة >

و تستخدم أيضا عند حصول interrupt حيثم يتم دفع push جميع المتغيرات فى البرنامج اليها و الذهاب الى ISR interrupt service routine ثم الانتهاء منه و يتم عمل pop اى اخراج للبيانات و العودة للحالة الطبيعية فى البرنامج .

و يتم تحديد مساحتها برمجيا عن طريق بعض اعدادات الcompiler .

تقصد انها تحتفظ ب local varaibles للدالة وايضا عند استدعاء دالة اخري من دالة تحفظ ايضا عنوان الدالة الاولى اي انها تحتفظ بمتغيرات المحلية وايضا العناوين للدول .
لا تحتفظ للابد , فهى تقوم فى بعمل pop اى اخراج فى حالة الخروج من الدالة المنادى عليها , للعودة الى دالة أخرى
مش للأبد اكيد ....بس بتحتفظ بعناوين ومتغيرات صح؟
بالضبط ...........
0 صوت

ذاكرة call stack هي ذاكره وهميه تستخدم اثناء runtime في الجزء الاكبر من الرام وهوه heaps وتحجز المساحه في اثناء ال runtime و من اهم الاشياء التي تميز لغة c انك تقدر ان تستخدم هذا الجزء اثناء برمجتك باستخدام pointers
للمذيد من المعلومات عنها انصحك بقراءة هذه المقاله
Call Stack
وهذا كود توضيحي لكيفية استغلال heaps باستخدام ال pointers

int *p;
        p=(int*)malloc(20*sizeof(int));
        cout << *(p+4) << "\t" << sizeof(p) <<endl;
        cout << *(p+5) << "\t" << sizeof(p) <<endl;
        cout << *(p+20) << "\t" << sizeof(p) <<endl;

في هذا الكود ستلاحظ اني استخدمت مساحه وهميه وليست مساحة المتغير ولكن انصحك بعدم استخدام هذا الجزء بكثره وعند استخدامه يجب ان يكون بحرص شديد ويجب ان تفرغه باستمرار باستخدام الامر free او delete

انت تتحدث عن ذاكرة ال heap هنا وليس stack
stack call memory  تستخدم اثناء استدعاء الدوال حيث تخزن فيها المتغيرات من النوع auto  حتى انتهاء الاستدعاء فيتم تفريغ الذاكرة بطريقة LIFO
انما ما اقصده معلومات اكثر عنها وحجمها وهل هي تخزن فقط قيم المتغيرات في الدوال المستدعاة ام تخزن ايضا العنوان لأخر تعليمة قبل استدعاء الدوال ؟؟
...