ماهو Stack & Heap

السلام عليكم ورحمة الله وبركاتة

انا الان في مرحلة تشتت

اتمنى شرح ماهو Stack & Heap وكيف يخزن بالذاكرة وياليت لو توجد صور توضيحية لافهم اكثر مع شرح مفصل

سؤال اخر : لماذا نستخدم new في تعريف الكائنات ام فقط مع اللتي تحتوي على المشيدات


ال stack و ال heap هماطرق للتعامل مع الذاكره

ال stack هو طريقه معينه فى ترتيب العناصر حيث يتم اضافه العنصر الجديد خلف او اعلى جميع العناصر القديمه ولا يمكنك الوصول الى اى عنصر غير العنصر الاخير ثم العنصر قبل الاخير يمكنك تخيل الموضوع بتكديس او وضع مجموعه كتب فوق بعضها حيث لا يمكنك الوصول الى اول كتاب من اسفل، فقط يمكنك الوصول الى اول كتاب من اعلى ثم الذى يليه وهكذا بشكل عام يدعم ال stack عمليتين funcion العمليه الاولى هى الاضافه الى اعلى push العمليه الثانيه هى الحذف من الاعلىpop

وكمثال تطبيقى لديك مصفوفه خاليه

stack =[];

اذا اردت اضافه العناصر 1 2 3 4 5 فسيكون هكذا

stack.push(1); // [1]
stack.push(2); // [1,2] 
stack.push(3); //[1 ,2 ,3]
stack.push(4); // [1,2,3,4]
stack.push(5); //[1,2,3,4,5]

والان اذا اردت اول عنصر متاح من الstack فسيكون هكذا

topOfStack=stack.pop(); //topOfStack=5  , stack= [1,2,3,4]
topOfStack=stack.pop(); //topOfStack=4  , stack= [1,2,3]
topOfStack=stack.pop(); //topOfStack=3  , stack= [1,2]

وهكذا والان ناتى للجزء الهام وهو علاقه هذا بالذاكره عندما يتم عمل compile للكود فان الcompiler يقوم فى النهايه بتخزين ال memory address الخاصه بال functions فمثلا

 function A(){  // memory address 100000
     print("in A"); // 100001
    B(); // 100002
    print("returned to A"); // 100003
}
function B(){  // 200000
    print("in B"); // 200001
    C();  // 200002
    print("returned to B"); // 200003
}
function C(){ // 300000
    print("in C"); // 300001
}

نتيجه هذا الكود يجب ان تكون كالتالى

in A
in B
in C
returned to B
returned to A

لا مشكله فى اول ثلاث جمل طباعه لكن عند الجمله الرابعه والخامسه ستلاحظ عوده الكود للتنفيذ عن موضع محدد والstack يستخدم فى تخزين المواضع ليستطيع العوده مره اخرى لاكمال التنفيذ

ككود لديك stack= [];

//goto 100000 and execute code
stack.push( 100001); // [ 100001]
//goto 200000 and execute code
stack.push(200001); // [100001,200001] 
//goto 300000 and execute code
topOfStack=stack.pop(); //topOfStack=200001
// goto   topOfStack+1 and execute 
topOfStack=stack.pop(); //topOfStack=100001
// goto   topOfStack+1 and execute 

شاهد كيف يعمل ال stack من هنا http://visualgo.net/list

اما الheap فيمكنك اعتبارها raw memory اى الذاكره بدون اى ترتيب ويمكتك الوصول الى اى مكان وما يتم انشاءه بال heap يظل به حتى ينتهى البرنامح على عكس ال stack ما يتم انشاءه به يظل حتى يتم عمل pop له

++++++++++++++++++++++++++++

لا علاقه بين new وكتابه ال constructors فحتى ولو لم تكتب ال constructor صراحه فهو موجود ضمنيا فائده new هو انها تقوم بعملتين متتابعين

1- allocation وهو حجز منطقه مناسبه من ال heap فاذا كان لديك كائن بهذا الشكل

class Human{
string name;
int age;
bool isMarried;
}

فان الكمبيلر سيقوم بجمع احجام الخصائص properties

required_memeory_space=sizeof(name)+sizeof(age)+sizeof(isMarried)

لتقدير الحجم المناسب لهذا الكائن وحجزه بالذاكره

2- initlization

عندما تقوم باغلاق اى برنامج فان نظام التشغيل لا يقوم بمسح الذاكره التى احتلها بل فقط يقوم بحذف السجلات المتعلقه بها معنى هذا ان منطقه الذاكره هذه مازال بها بيانات قديمه garbage فاذا حجز النظام هذه الذاكره لبرنامج جديد فانه يستطيع الوصول لبيانات لا تخصه اطلاقا ولأن من مبادئ نظام التشغيل حمايه البرامج protection من بعضها البعض وعدم السماح بالوصول لبيانات غير مسموح بها فانه يقوم بكتابه القيم الافتراضيه للمتغيرات فمثلا int تصبح قيمته الافتراضيه 0 وbool يصبح false وهكذا

شكرا جزيلآ لك