الوجبات السريعة الرئيسية
- يتم تخصيص الذاكرة المخصصة بشكل ثابت في وقت الترجمة، بينما يتم تخصيص الذاكرة المخصصة ديناميكيًا في وقت التشغيل. وهذا يجعل التخصيص الثابت أسرع ولكن أقل مرونة.
- تأتي ذاكرة التخصيص الثابت من مقطع المكدس، بينما يستخدم التخصيص الديناميكي مقطع الكومة. المكدس له حدود للحجم ولكن الوصول إليه أسرع.
- الذاكرة المخصصة بشكل ثابت لها حجم ثابت ومحدد مسبقًا، ويمكن للتخصيص الديناميكي تخصيص/إلغاء التخصيص حسب احتياجات البرنامج أثناء التنفيذ.
ما هو تخصيص الذاكرة الثابتة في لغة C؟
يشير تخصيص الذاكرة الثابتة في لغة C إلى تخصيص الذاكرة للمتغيرات أو هياكل البيانات أثناء مرحلة الترجمة، قبل تنفيذ البرنامج. تظل الذاكرة المخصصة باستخدام التخصيص الثابت ثابتة طوال فترة تنفيذ البرنامج ويتم تحديدها في وقت الترجمة. يتناقض هذا مع تخصيص الذاكرة الديناميكي، حيث يتم تخصيص الذاكرة في وقت التشغيل باستخدام وظائف مثل malloc() ويمكن تغيير حجمها أو إلغاء تخصيصها حسب الحاجة.
يتميز تخصيص الذاكرة الثابتة بكونه فعالاً، حيث يتم تخصيص الذاكرة وإدارتها بواسطة المترجم نفسه. ومع ذلك، فإنه يحتوي على قيود، مثل عدم القدرة على تغيير حجم الذاكرة أثناء وقت التشغيل وإهدار الذاكرة المحتمل إذا لم يتم استخدام المساحة المخصصة بالكامل. يمكن أن يؤدي تخصيص الذاكرة الثابتة أيضًا إلى مشكلات مثل تجاوز سعة المخزن المؤقت إذا لم يتم استخدامه بعناية.
ما هو تخصيص الذاكرة الديناميكية في لغة C؟
يشير تخصيص الذاكرة الديناميكية في لغة C إلى تخصيص وإلغاء تخصيص الذاكرة للمتغيرات وهياكل البيانات أثناء وقت تشغيل البرنامج. على عكس تخصيص الذاكرة الثابتة، حيث يتم تخصيص الذاكرة في وقت الترجمة وتبقى ثابتة، يتيح لك تخصيص الذاكرة الديناميكية طلب الذاكرة من نظام التشغيل حسب الحاجة وتحريرها عندما لا تكون هناك حاجة إليها. يوفر هذا مرونة أكبر في إدارة موارد الذاكرة وهو ضروري لإنشاء هياكل البيانات التي يتم تحديد أحجامها في وقت التشغيل.
يعد تخصيص الذاكرة الديناميكية مفيدًا عندما لا تعرف حجم الذاكرة المطلوبة في وقت الترجمة، أو عندما يمكن أن تتغير متطلبات الذاكرة أثناء تنفيذ البرنامج. تتضمن حالات الاستخدام الشائعة إنشاء صفائف ديناميكية وقوائم مرتبطة وأشجار وهياكل بيانات أخرى يمكن أن تنمو أو تتقلص حسب الحاجة.
الفرق بين تخصيص الذاكرة الثابتة والديناميكية في C
- يتم تخصيص الذاكرة الثابتة أثناء وقت الترجمة قبل بدء تشغيل البرنامج. يتم تخصيص الذاكرة الديناميكية أثناء وقت التشغيل أثناء تنفيذ البرنامج.
- يتم تحديد حجم الذاكرة الثابتة في وقت الترجمة ويظل ثابتًا طوال تنفيذ البرنامج. يمكن تحديد حجم الذاكرة الديناميكية في وقت التشغيل وتغييره أثناء تنفيذ البرنامج.
- تعتبر الحالة الثابتة أقل مرونة، حيث أن تخصيص الذاكرة ثابت ولا يمكن تغييره أثناء وقت التشغيل. تعد الديناميكية أكثر مرونة، حيث يمكن تخصيص الذاكرة وتغيير حجمها وإلغاء تخصيصها حسب الحاجة.
- يتم تخصيص المتغيرات الثابتة بشكل ثابت ولها عمر يمتد إلى تنفيذ البرنامج بأكمله. يتم تخصيص الذاكرة الديناميكية ديناميكيًا وتكون موجودة فقط طالما يحتفظ البرنامج بمرجع إليها؛ يمكن تحريره باستخدام free().
- يدير المترجم ثابت؛ لا يتطلب المبرمج إدارة واضحة للذاكرة. يتطلب الديناميكي تخصيصًا صريحًا للذاكرة وإلغاء التخصيص باستخدام وظائف مثل malloc() وcalloc() وrealloc() وfree().
مقارنة بين تخصيص الذاكرة الثابتة والديناميكية في لغة C
معلمات المقارنة | تخصيص الذاكرة الثابتة | تخصيص الذاكرة الديناميكي |
---|---|---|
التهيئة | تتم تهيئة المتغيرات إلى القيم الافتراضية (صفر للمتغيرات العامة والثابتة). | تحتوي الذاكرة المخصصة ديناميكيًا على قيم غير محددة؛ يحتاج إلى تهيئة صريحة. |
موقع الذاكرة | يتم تخصيص الذاكرة في جزء البيانات من البرنامج. | يتم تخصيص الذاكرة في مقطع الكومة من مساحة ذاكرة البرنامج. |
حجم الصفيف | يجب أن يكون حجم المصفوفة معروفًا في وقت الترجمة؛ حجم ثابت. | يمكن تغيير حجم المصفوفات ديناميكيًا باستخدام realloc(). |
فوق | حمل أقل، حيث يتم تخصيص الذاكرة مرة واحدة أثناء بدء تشغيل البرنامج. | المزيد من الحمل بسبب تخصيص وقت التشغيل وتجزئة الذاكرة المحتملة. |
النطاق والوصول | يمكن الوصول إلى المتغيرات ضمن نطاق كل منها. | يمكن تمرير الذاكرة المخصصة ديناميكيًا حول الوظائف، مما يزيد من نطاقها. |
- https://ieeexplore.ieee.org/abstract/document/6807799/
- https://inria.hal.science/hal-02456533/document