الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هو الفرق بين ال Dynamic Memory و Static Memory

مغلق
بدأه css في 9 فبراير 2008 · 7 رد · 7,528 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أريد شرحاً مفصلاً للفرق بين :

dynamic memory و static memory

وشكرا

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 11 فبراير 2008 في 01:55

#2

اهلا وسهلا بك اخي ..

يعني انت سؤالك يتكون من كم كلمة ولكن جوابه عدة صفحات ..

ولكن ان شاءالله اوصل لك الفكرة ..

اسمع يا اخي ...

الstatic من اسمه يعني ثابت .. ف static memory هي الذاكرة الثابته والتي لايمكنك تغيرها ..

فمثلا .. المصفوفات وتعريفها العادي بلغة c++ هي ذاكرة ثابته .. كما في الكود التالي ..

int a[20];

المصفوفة هنا متكونه من 20 موقع ولا يمكننا تغيرها الا من خلال كود البرنامج .. يعني عندما يتنفذ البرنامج لديك فقط 20 موقع ..

لذلك تجد المبتدئين في لغة السي والسي ++ عندما يحتاجون لعدد غير معروف من المواقع للمصفوفة يدخله المستخدم.. ياخذون قيمة كبيرة لمواقع المصفوفة .. مثلا 100 موقع والمستخدم يدخل مثلا 20 .. فتبقى لدينا 80 موقع فارغ محجوزه ولكن غير مستخدمه .. فهذا يسبب هدر للذاكرة ..

ولكن علاج هذه المشكله يكون بالذاكرة الديناميكيه او الحجز الديناميكيdynamic memory .. واساسها المؤشرات ..

الذاكرة الديناميكيه من اسمها تعني انها متغيرة الحجم .. اي انه يمكن تغير حجمها اثناء عمل البرنامج ..

فمثلا انت تستطيع تعريف مصفوفة ولكنها تكون مجهولة الحجم .. والمستخدم يدخل عدد المواقع .. ويمكن تغيرها ايضا عند العمل ..

لناخذ الكود التالي ..

int *p;
p = new int [n];

هنا لدينا المؤشر p يشير الى مصفوفة متغيره تكون محجوزة في الheap .. او ما تعرف به عربيا بالكومه .. وهذه المصفوفة عدد عناصرها اومواقعها يكون n وهو متغير يدخل من قبل المستخدم ..

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

والمثال التالي لتوضيح الكلام اعلاه ..

void main()
   {
		  int a[20];
		 int *p, n;

cout >> " enter the number of element ..";
cin >> n;

						 p = new int [n];

for(int i = 0;i<n;i++)
cin >> p;

for(int i = 0;i<n;i++)
cout <<  p<<endl;

delete []p;
cout << "enter new number of element .. ";
cin << n;
p = new int [n];
for(int i = 0;i<n;i++)
cin << p;

delete []p;
  }

طبعا هذا الكود بسيط جدا ويمكن ان تكون به اخطاء .. ولكن هو فقط للتوضيح ..

فقط احب ان انوه لشئ وهو استخدمنا الامر delete لحذف ما كان يشير اليه المؤشر p لنعيد تعيين قيمة اخرى جديده ..

اعلم ان شرحي متواضع للموضوع .. ولكن كما قلت لك في بداية الشرح .. هذا الموضوع له شرح طويل .. ولكن هنا فقط اردت ان اعطيك اساس له ... واذا اي شئ غير واضح او من الممكن ان اكون قد نسيت توضيحه .. اكتبه واشرحه لك لكي اكون ملما بجوانب عديده من الموضوع في الشرح .

انا في الخدمة ...

تحياتي العطرة ...

تم تعديل هذه المشاركة بواسطة سنان محمد صالح في 9 فبراير 2008 في 23:14

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#3

السلام عليكم ,,

شكراً للأخ سنان على الشرح, و لكني أعتقد أن الأخ سنان اختلط عليه الموضوع قليلاً,

سأحاول الرجوع لشرح الموضوع لاحقاً,

تحياتي,,

#4
اقتباس
لكني أعتقد أن الأخ سنان اختلط عليه الموضوع قليلاً

لم افهم قصدك ياخالد .؟

هو طلب الفرق بين الخزن الثابت والمتغير .. او الذاكرة الثابته والمتغيره..

انا فهمتها هذه ,,,

اطلب من صاحب الموضوع اذا كنت قد فهمت الموضوع خطأ ان يوضح طلبه لكي اعيد النظر في شرحي..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#5

السلام عليكم ,,

أخي سنان, ما تكلمت عنه هو الفرق بين الذاكرة الـ Auto و بين الذاكرة الـ Dynamic ,

أما الذاكرة الـ Static هي الذاكرة التي يتم حجزها بداية عمل البرنامج و تنتهي بانتهائه, مثال على ذلك :

int func(){
	static int x;

	return x;
}

سأعود للموضوع لاحقاً, اعذروني حالياً,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 10 فبراير 2008 في 11:22

#6

خالد ..

الstatic هو الذاكرة الثابته التي لا يمكن تغييرها ...

انا قصدت بها الحجم الثابت .. وانت تقول

اقتباس
أما الذاكرة الـ Static هي الذاكرة التي يتم حجزها بداية عمل البرنامج و تنتهي بانتهائه, مثال على ذلك

فما الفرق بين الاثنين .؟؟

يعني انا تكلمت عنها على انها لا تتغير اثناء عمل البرنامج ويبقى ثابتا ..

وضح اكثر ..

تحياتي العطرة

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#7

السلام عليكم ,,

أخ سنان, سأضيف مقالاً في موضوع جديد, لتوضيح الأمر خلال يوم أو يومين, لأن الموضوع يحتاج لبعض التفصيل.

تحياتي ,,

#8

اخي الكريم

تقوم البرامج على حجز مساحةمن الذاكرة Ram تسمى Code Segment تضع فيها كود البرنامج , وحجز مساحة اخرى تسمى Data Segment لتضع بها تعريفات المتغيرات والثوابت , بالنسبة لمساحة الData Segment كبيرة لكن محدود ,

لكن تخيل معي لو ان لديك برنامج يحتوي على تعريف متغيرات كبيرة مثلا تعريف مصفوفات كثيرة ذات ابعاد 100 في 100

, ربما لا تتسع المساحة Data Segment إلى هذا الكم من المتغيرات , لذلك نلجأ لاستخدام المتبقي من الذاكرة Ram وهي مساحة كبيرة جدا لكن يختلف التعامل معها عن Data Segment , ولفهم ذلك تخيل معي :

لدينا ارض مساحتها محدوده ولنفترض 60 * 60 تتسع لعدد n من المنازل ,ثم اتى مجموعة من الاشخاص وقاموا ببناء منازلهم بها , المنزل الاول والثاني .... المنزل رقم n عندها ببساطة يستطيع موصل طلبات البيتزا بالتنقل بين هذه المنازل وفقا لعنوان كل منزل ,لكن تخيل لو اتى شخص جديد يريد انشاء منزل بعد العدد n عندها هذه الارض لن تكفي لانشاء منزل هذا الشخص , مالحل ؟

يوجود ارض مجاورة كبيرة الحجم تسمى (heap) وهي ماتبقى من مساحة المدينة Ram يستطيع هذا الشخص ان يقول لشركة المقاولات ان تنشأ له المنزل بواسطة الامر (new) عندها سينشأ المنزل , وليتم التعامل مع هذا المنزل يجب ان يعاد عنوان هذا المنزل إلى دفتر العناوين لمحل البيتزا ولنفرض ان مسؤول التنسيق بالمحل وضع عنوان هذا المنزل داخل الدفتر في الصفحة A, عندها يستطيع موصل الطلبات ان يوصل البيتزا إلى المنزل في الارض المجاورة بناء على عنوان المنزل .

هدر الذاكرة :

تخيل بأنه اتى شخص اخر وانشأ منزل جديد بواسطة الامر new داخل هذه الارضيةheap ومن ثم اعاد عنوان منزله إلى محل البيتزا , ومسؤول التنسيق بالمحل قام بشطب عنوان المنزل الموجود بالصفحة A (نظرا لقلة طلباتهم ) ووضع مكانه عنوان منزل الشخص الجديد , وبعد فترة من الزمن اتصل صاحب المنزل الاول وطلب بيتزا , كيف سيقوم موصل الطلبات بمعرفة عنوان المنزل الاول ؟

هذا مايسمى بهدر الذاكرة .

ماسبق كان مثال عفويا , لكن لننظر لهذا السؤال من الناحية البرمجية ,

كما قلنا بأن المساحة Data Segment محدودة الحجم , فإذا احتجت إلى تعريف متغيرات جدد تستطيع ان تحجزها داخل الذاكرة heap بواسطة الامر new وتعيد عنوان هذا المتغير إلى مؤشر p1 مثلا , عندها تستطيع التعامل مع هذا المؤشر باسناد القيم واجراء العمليات الممكنة على نوع البيانات , لكن لو قمت بحجز متغير اخر داخل هذه الذاكرة بواسطة الامر new واعدت عنوان هذا المتغير إلى p1 فإن التعامل سيصبح مع المتغير الجديد اما المتغير القديم فسيصعب الوصول إلى عنوانه , لذلك يجب حذف هذا المتغير قبل اعطاء عنوان المتغير الجديد للمؤشر , وذلك بواسطة الامر delete

تخيل معي لو انك قمت بحجز مصفوفة 100 * 100 داخل الذاكرة heap واعدت عنوان هذه المصفوفة للمؤشر p1 بعدها قمت بحجز مصفوفة 100*100 اخرى داخل الذاكرة heap واعدت العنوان ايضا للمؤشر p1 عندها ستستطيع التعامل فقط مع المصفوفة الثانية , اما المصفوفة الاولى والتي تحتوي على 10000 عنصر محجوزة بالذاكرة لكن لاتستطيع الوصول إليها , وهو هدر كبير بالذاكرة لذلك يجب تحريرها بواسطة الامر delete اذا لم تكن هناك حاجة لهذه العناصر او اعطاء عنوان المصفوفة الثانية إلى مؤشر اخر p2 لضمان التحكم والوصل إلى العناصر لكلا من المصفوفتين.

اتمنى ان اكون قد وفقت بشرحي وشكرا.

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

هذا الموضوع مغلق.

مواضيع مشابهة