x32x01
أدارة أكتب كود
- بواسطة x32x01 ||
ازاى الـ Data بتتخزن فى الـ Memory ؟!
ويعنى ايه Stack ويعنى ايه Heap ؟!
خلينا فى الاول نعرف ان ال Memory ( اقصد بيها هنا ال RAM ) بتتكون من مجموعة اقسام بس اللى هنهتم بيهم فى الموضوع ده هما ال Stack وال Heap
( والتقسيمة دى بتكون حاجه Logical واللى بيحددها هو ال Operating system )
خلينا بقا فى الاول نبدء بأسهل حاجه وهو اننا عرفنا ال Variable ده
وعايزين نعرف ازاى هيتخزن فى ال RAM
لو ركزنا شوية على ال Variable ده هنلاحظ ان نوعه int ومن فهمنا لل Data types هنعرف ان ال int ده primitive data type يعنى حجمه بيكون ثابت وهو فى ال Java حجمه 4 بايت
فهنروح نكلم ال RAM ونقولها احنا عايزين نخزن ال Variable ده اللى اسمه age فهيا هتقولك ده حجمه ثابت ( يعنى ليه حجم ثابت دايما وبيتحسب فى ال Compile Time ) والحاجات اللى حجمها ثابت بتتخزن عندى فى حاجه اسمها Stack
فمن هنا نستنتج ان اى حاجه حجمها ثابت هتتخزن فى ال Stack والحاجات اللى حجمها ثابت زى ال int وال double وال float
ولو مثلا بنخزن int فهيتحجز مكان حجمه 4 بايت لل Variable ده والحجم المحجوز هيتغير باختلاف ال Data type اللى انت بتخزنها
خلاص كدا فهمنا ايه وظيفة ال Stack وازاى ال primitive data types بتتخزن
خلينا دلوقتى نروح ونضرب مثال تانى
احنا دلوقتى عرفنا ال Variable ( اسمه Object بمعنى اصح بس ده للتوضيح بس ) ده
وعايزين نعرف ازاى هيتخزن فى ال RAM
لو ركزنا شوية على ال Variable ده هنلاحظ ان نوعه String ومن فهمنا لل Data types هنعرف ان ال String ده non primitive data type يعنى حجمه مش ثابت وحجمه بيتغير بناء على حجم النص اللى هيتخزن جواه
فهنروح نكلم ال RAM ونقولها احنا عايزين نخزن ال Variable ده اللى اسمه name فهيا هتقولك ده حجمه متغير وانا عندى مشكلة ان ال Stack مينفعش يتخزن فيها حاجه حجمها مش ثابت ( او بمعنى اصح حجمها بيتحسب فى ال run time بناء على حجم الداتا اللى هتتخزن جواها )
بس فى نفس الوقت هتقولك الحل لمشكلتك دى عندى وهو ان انا عندى مكان تانى بيتخزن فيه الحاجات اللى حجمها مش ثابت والمكان الثانى ده اسمه ال Heap
وهتقولك بردو انا هحجزلك مكان لل Variable ده فى ال Heap بس المكان ده مش هيكون محدود بمساحة معينة ( يعنى مش زى المثال اللى ذكرناه فى ال Stack )
يعنى هحجزلك المكان ده وحجمه هيتغير عادى بناء على حجم الداتا اللى هتخزنها فى ال Variable ده
بس فى نفس الوقت هروح اعملك مؤشر فى ال Stack بيشاور على المكان المحجوز لحفظ ال Variable اللى اسمه name
والمؤشر ده هيكون اسمه name وده اللى هيستخدم علشان نوصل للمكان اللى هيتخزن فيه ال name
ال Heap بيتخزن فيه اى حاجه حجمها مش ثابت Non-Primitive data types ( بيتحسب فى ال run time حسب حجم الداتا اللى هتتخزن فيه ) زى ال Objects او ال String او ال Array وهكذا
ال Stack بيتخزن فيه ال Variables اللى حجمها ثابت ( Primitive data types ) زى ال int وال float وال boolean وهكذا
وكمان بيتخزن فيها مؤشر بيشاور على المكان اللى بيتخزن فيه ال Object فى ال Heap
لايك بقى شير للموضوع ده عشان الكل يستفاد (سوف تجد أزرار الشير فى أعلى الموضوع)
ويعنى ايه Stack ويعنى ايه Heap ؟!
خلينا فى الاول نعرف ان ال Memory ( اقصد بيها هنا ال RAM ) بتتكون من مجموعة اقسام بس اللى هنهتم بيهم فى الموضوع ده هما ال Stack وال Heap
( والتقسيمة دى بتكون حاجه Logical واللى بيحددها هو ال Operating system )
خلينا بقا فى الاول نبدء بأسهل حاجه وهو اننا عرفنا ال Variable ده
Code:
int age = 15 ;
لو ركزنا شوية على ال Variable ده هنلاحظ ان نوعه int ومن فهمنا لل Data types هنعرف ان ال int ده primitive data type يعنى حجمه بيكون ثابت وهو فى ال Java حجمه 4 بايت
فهنروح نكلم ال RAM ونقولها احنا عايزين نخزن ال Variable ده اللى اسمه age فهيا هتقولك ده حجمه ثابت ( يعنى ليه حجم ثابت دايما وبيتحسب فى ال Compile Time ) والحاجات اللى حجمها ثابت بتتخزن عندى فى حاجه اسمها Stack
فمن هنا نستنتج ان اى حاجه حجمها ثابت هتتخزن فى ال Stack والحاجات اللى حجمها ثابت زى ال int وال double وال float
ولو مثلا بنخزن int فهيتحجز مكان حجمه 4 بايت لل Variable ده والحجم المحجوز هيتغير باختلاف ال Data type اللى انت بتخزنها
خلاص كدا فهمنا ايه وظيفة ال Stack وازاى ال primitive data types بتتخزن
خلينا دلوقتى نروح ونضرب مثال تانى
احنا دلوقتى عرفنا ال Variable ( اسمه Object بمعنى اصح بس ده للتوضيح بس ) ده
Code:
String name = "ahmed" ;
لو ركزنا شوية على ال Variable ده هنلاحظ ان نوعه String ومن فهمنا لل Data types هنعرف ان ال String ده non primitive data type يعنى حجمه مش ثابت وحجمه بيتغير بناء على حجم النص اللى هيتخزن جواه
فهنروح نكلم ال RAM ونقولها احنا عايزين نخزن ال Variable ده اللى اسمه name فهيا هتقولك ده حجمه متغير وانا عندى مشكلة ان ال Stack مينفعش يتخزن فيها حاجه حجمها مش ثابت ( او بمعنى اصح حجمها بيتحسب فى ال run time بناء على حجم الداتا اللى هتتخزن جواها )
بس فى نفس الوقت هتقولك الحل لمشكلتك دى عندى وهو ان انا عندى مكان تانى بيتخزن فيه الحاجات اللى حجمها مش ثابت والمكان الثانى ده اسمه ال Heap
وهتقولك بردو انا هحجزلك مكان لل Variable ده فى ال Heap بس المكان ده مش هيكون محدود بمساحة معينة ( يعنى مش زى المثال اللى ذكرناه فى ال Stack )
يعنى هحجزلك المكان ده وحجمه هيتغير عادى بناء على حجم الداتا اللى هتخزنها فى ال Variable ده
بس فى نفس الوقت هروح اعملك مؤشر فى ال Stack بيشاور على المكان المحجوز لحفظ ال Variable اللى اسمه name
والمؤشر ده هيكون اسمه name وده اللى هيستخدم علشان نوصل للمكان اللى هيتخزن فيه ال name
ال Heap بيتخزن فيه اى حاجه حجمها مش ثابت Non-Primitive data types ( بيتحسب فى ال run time حسب حجم الداتا اللى هتتخزن فيه ) زى ال Objects او ال String او ال Array وهكذا
ال Stack بيتخزن فيه ال Variables اللى حجمها ثابت ( Primitive data types ) زى ال int وال float وال boolean وهكذا
وكمان بيتخزن فيها مؤشر بيشاور على المكان اللى بيتخزن فيه ال Object فى ال Heap
لايك بقى شير للموضوع ده عشان الكل يستفاد (سوف تجد أزرار الشير فى أعلى الموضوع)