كومة مقابل مكدس لمطوري دلفي

click fraud protection

استدعاء وظيفة "DoStackOverflow" مرة واحدة من الكود الخاص بك وستحصل على EStackOverflow الخطأ الذي أثارته دلفي مع رسالة "تجاوز سعة المكدس".


وظيفة DoStackOverflow: عدد صحيح ؛

ابدأ

 النتيجة: = 1 + DoStackOverflow ؛

النهاية؛

ما هو هذا "المكدس" ولماذا هناك فيض هناك باستخدام الرمز أعلاه؟

لذا ، فإن وظيفة DoStackOverflow تطلق على نفسها بشكل متكرر - بدون "استراتيجية خروج" - تستمر في الدوران ولا تخرج أبدًا.

يمكنك القيام بإصلاح سريع ، هو مسح الخطأ الواضح الذي تعاني منه ، والتأكد من وجود الوظيفة في مرحلة ما (بحيث يمكن أن يستمر تنفيذ التعليمات البرمجية من حيث قمت باستدعاء الوظيفة).

أنت تمضي قدمًا ، ولا تنظر إلى الوراء أبدًا ، ولا تهتم بالخلل / الاستثناء لأنه تم حله الآن.

ومع ذلك ، يبقى السؤال: ما هو هذا المكدس ولماذا هناك فيض?

الذاكرة في تطبيقات دلفي الخاصة بك

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

مع اكتساب المزيد من الخبرة في دلفي ، تبدأ في إنشاء فصولك الخاصة ، واستنساخها ، والاهتمام بإدارة الذاكرة وما شابه.

instagram viewer

ستصل إلى النقطة التي ستقرأ فيها ، في التعليمات ، شيئًا مثل "المتغيرات المحلية (المعلنة في الإجراءات والوظائف) موجودة في التطبيق كومة." و أيضا الفئات هي أنواع مرجعية ، لذلك لا يتم نسخها في المهمة ، ويتم تمريرها حسب المرجع ، ويتم تخصيصها في كومة.

إذن ، ما هو "المكدس" وما هو "الكومة"؟

المكدس مقابل كومة

تشغيل التطبيق الخاص بك على Windows، هناك ثلاث مناطق في الذاكرة حيث يقوم التطبيق بتخزين البيانات: الذاكرة العامة ، الكومة ، والمكدس.

يتم تخزين المتغيرات العالمية (قيمها / بياناتها) في الذاكرة العامة. يحتفظ التطبيق بذاكرة المتغيرات العامة عند بدء تشغيل البرنامج ويظل مخصصًا حتى انتهاء البرنامج. تسمى الذاكرة للمتغيرات العالمية "مقطع البيانات".

نظرًا لأن الذاكرة العالمية يتم تخصيصها وتحريرها مرة واحدة فقط عند إنهاء البرنامج ، فإننا لا نهتم بها في هذه المقالة.

المكدس والكومة هي المكان الذي يتم فيه تخصيص الذاكرة الديناميكية: عندما تقوم بإنشاء متغير للدالة ، عند إنشاء مثيل لفئة ما عند إرسال معلمات إلى دالة واستخدام / تمرير نتيجتها القيمة.

ما هو المكدس؟

عندما تقوم بتعريف متغير داخل دالة ، يتم تخصيص الذاكرة المطلوبة للاحتفاظ بالمتغير من المكدس. يمكنك ببساطة كتابة "var x: integer" ، واستخدام "x" في وظيفتك ، وعندما تنتهي الوظيفة ، لا تهتم بتخصيص الذاكرة أو تحريرها. عندما يخرج المتغير عن النطاق (يخرج الرمز من الوظيفة) ، يتم تحرير الذاكرة التي تم أخذها على المكدس.

يتم تخصيص ذاكرة المكدس ديناميكيًا باستخدام نهج LIFO ("الأخير في أول مخرج").

في برامج دلفي، يتم استخدام ذاكرة مكدس من قبل

  • المتغيرات الروتينية المحلية (الطريقة ، الإجراء ، الوظيفة).
  • المعلمات الروتينية وأنواع العودة.
  • وظيفة Windows API المكالمات.
  • السجلات (هذا هو السبب في أنك لست مضطرًا إلى إنشاء مثيل من نوع السجل بشكل صريح).

لا يتعين عليك تحرير الذاكرة على الرصة بشكل صريح ، لأن الذاكرة يتم تخصيصها بطريقة سحرية تلقائيًا عندما تقوم ، على سبيل المثال ، بتعريف متغير محلي على دالة. عند خروج الوظيفة (أحيانًا حتى قبل ذلك بسبب تحسين مترجم دلفي) ، سيتم تحرير ذاكرة المتغير تلقائيًا بطريقة سحرية.

حجم الذاكرة المكدس هي ، بشكل افتراضي ، كبيرة بما يكفي لبرامج دلفي (كما هي معقدة). تحدد قيم "الحد الأقصى لحجم المكدس" و "الحد الأدنى لحجم المكدس" في خيارات Linker لمشروعك القيم الافتراضية - في 99.99٪ لن تحتاج إلى تغيير ذلك.

فكر في المكدس على أنه كومة من كتل الذاكرة. عندما تعلن / تستخدم متغيرًا محليًا ، سيختار مدير ذاكرة Delphi الكتلة من الأعلى ، ويستخدمها ، وعندما لا تكون هناك حاجة إليها مرة أخرى ، سيتم إرجاعها إلى المكدس.

باستخدام ذاكرة متغيرة محلية مستخدمة من المكدس ، لا يتم تهيئة المتغيرات المحلية عند التصريح عنها. قم بتعريف متغير "var x: integer" في بعض الوظائف وحاول فقط قراءة القيمة عند إدخال الدالة - x سيكون لها قيمة "غريبة" غير صفرية. لذا ، قم دائمًا بتهيئة (أو تعيين القيمة) للمتغيرات المحلية قبل قراءة قيمتها.

نظرًا لـ LIFO ، تكون عمليات التكديس (تخصيص الذاكرة) سريعة حيث لا يلزم سوى عدد قليل من العمليات (دفع ، فرقعة) لإدارة التكديس.

ما هو الكومة؟

الكومة هي منطقة من الذاكرة يتم فيها تخزين الذاكرة المخصصة ديناميكيًا. عند إنشاء مثيل لفئة ، يتم تخصيص الذاكرة من الكومة.

في برامج دلفي ، يتم استخدام ذاكرة كومة الذاكرة المؤقتة قبل / متى

  • إنشاء مثيل لفئة.
  • إنشاء وتغيير حجم المصفوفات الديناميكية.
  • تخصيص الذاكرة بشكل صريح باستخدام GetMem و FreeMem و New و Dispose ().
  • باستخدام سلاسل ANSI / wide / Unicode ، المتغيرات ، الواجهات (تتم إدارتها تلقائيًا بواسطة دلفي).

لا تحتوي ذاكرة الكومة على تخطيط جميل حيث سيكون هناك ترتيب معين لتخصيص كتل من الذاكرة. تبدو كومة من علبة الرخام. تخصيص الذاكرة من الكومة عشوائي ، كتلة من هنا من كتلة من هناك. وبالتالي ، تكون عمليات كومة الذاكرة المؤقتة أبطأ قليلاً من تلك الموجودة على المكدس.

عندما تطلب كتلة ذاكرة جديدة (أي إنشاء مثيل لفئة) ، سيتعامل مدير ذاكرة Delphi مع هذا نيابة عنك: ستحصل على كتلة ذاكرة جديدة أو مستخدمة ومهملة.

يتكون كومة الذاكرة المؤقتة من كافة الذاكرة الظاهرية (ذاكرة الوصول العشوائي ومساحة القرص).

تخصيص الذاكرة يدويًا

الآن بعد أن أصبح كل شيء عن الذاكرة واضحًا ، يمكنك بأمان (في معظم الحالات) تجاهل ما سبق والاستمرار في كتابة برامج دلفي كما فعلت بالأمس.

بالطبع ، يجب أن تكون على علم بموعد وكيفية تخصيص / تحرير الذاكرة يدويًا.

تم رفع "EStackOverflow" (من بداية المقالة) لأنه مع كل استدعاء لـ DoStackOverflow تم استخدام مقطع جديد من الذاكرة من المكدس وله قيود على المكدس. بهذه السهولة.

instagram story viewer