السلام عليكم ورحمة الله وبركاتة
انا الان في مرحلة تشتت
اتمنى شرح ماهو 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 وهكذا
التعليقات