أهلا ومرحبا بكم مرة أخرى. في هذه المحاضرة أريد أن أتحدث عن تخصيص الذاكرة الديناميكي.
يرتبط هذا ارتباطًا مباشرًا بالمؤشرات ، ولا يمكنك استخدامها إلا
في المؤشرات. اذا هيا بنا نبدأ.
لذلك عندما تحدد متغيرًا في c ، يقوم
المترجم تلقائيًا بتخصيص مقدار التخزين الصحيح لك بناءً على نوع البيانات.
لقد رأينا هذا طوال الوقت. عندما ننشئ الأعداد الصحيحة والعائمة والمضاعفات ، لا يتعين علينا تخصيص أي ذاكرة.
المترجم يفعل ذلك نيابة عنك. في الواقع يخصص بعض الذاكرة.
الشيء نفسه ينطبق على المؤشرات بالمناسبة. عند إنشاء مؤشر ، يتم تخصيص الذاكرة
لك ، بحيث تخزن نوع المؤشر ، العنوان.
الآن هذا لا يعني أن الذاكرة مخصصة لذلك العنوان.
حتى هذه النقطة ، كلما قمنا بتعيين البيانات إلى - لمؤشر
، فإننا دائمًا ما نخصص متغيرًا موجودًا.
لذلك إذا أردنا تخصيص البيانات
لمؤشر ، فقد استخدمنا علامة العطف وعنوان المشغل على متغير
كان لهذا المتغير ذاكرة مخصصة له بالفعل.
ولكن ماذا لو أردت إنشاء مؤشر ولم ترغب في تعيين عنوان المشغل له ، فأنت
تريد تخصيص الذاكرة ديناميكيًا. هذا ما تدور حوله هذه المحاضرة بأكملها.
لذلك من المستحسن في كثير من الأحيان أن تكون قادرًا على تخصيص التخزين ديناميكيًا
أثناء تشغيل البرنامج. خصص الذاكرة حسب حاجتك.
إذا كان لديك برنامج مصمم للقراءة في مجموعة من البيانات من ملف
إلى مصفوفة في الذاكرة ، فلديك ثلاثة خيارات.
يمكنك تحديد المصفوفة لتحتوي على أكبر عدد ممكن من العناصر التي يمكن تجميعها
، وهي ذات حجم ثابت.
إذا حددت المصفوفة التي تحتوي على 50 عنصرًا
، فستحتوي فقط على 50 عنصرًا. يقرر المترجم أنه 50 ، سيخصص هذا
القدر من الذاكرة عند تشغيله.
يمكنك استخدام مصفوفة ذات طول متغير لأبعاد حجم وقت تشغيل الصفيف.
تحدثنا قليلاً عن هذه المصفوفات ذات الطول
المتغير ، فهي غير مدعومة حتى C11. إنهم في الواقع يأخذون C11 ، ويضيفون C99.
هذا هو المكان الذي يمكنك فيه وضع المتغيرات.
لكن هذه لا تزال ذات حجم ثابت لأن كل هذا يعني
مصفوفات مرتبطة متغيرة كل ما يعنيه هو أنه يمكنك تمرير متغيرات للأحجام.
لكنها ما زالت ثابتة.
أو الخيار الأفضل هو أنه يمكنك تخصيص المصفوفة ديناميكيًا حسب حاجتك إليها.
وهناك وظائف c مختلفة يمكنك استدعاؤها للقيام بذلك.
لذلك سيكون من المفيد جدًا أن تكون قادرًا على تخصيص الذاكرة ديناميكيًا.
لذلك مع النهج الأول الذي كنا نقوم به طوال الوقت حتى الآن سواء
كانت مصفوفة أو نوع بيانات ، فهي ذات حجم ثابت.
يجب عليك تحديد المصفوفة الخاصة بك لتحتوي على أكبر عدد ممكن من العناصر
التي ستكون موجودة في المصفوفة.
لذا ستفعل شيئًا كهذا ، int dataArray [1000].
ما يعنيه هذا هو أن ملف البيانات لا يمكن أن يحتوي على أكثر من ألف عنصر.
إذا حدث ذلك ، فسوف يتعطل برنامجك.
لذلك عليك فقط أن تأمل ألا يحتوي الملف الذي تقرأ فيه على الكثير من البيانات.
لن يعمل برنامجك مع مجموعات كبيرة من الملفات أو الملفات الكبيرة.
وإذا كنت تريد العمل مع الملفات الكبيرة ، فعليك العودة إلى الوراء وعليك أن تجعل المصفوفة أكبر.
يجب عليك تغيير الحجم ، ولكن بعد
ذلك عليك إعادة تجميعه في كل تلك الأشياء ، لقد حان وقت التجميع.
بغض النظر عن القيمة التي تحددها ، لديك دائمًا فرصة للوقوع
في نفس المشكلة مرة أخرى في المستقبل لأنها ذات حجم ثابت.
يتم تحديد هذا الحجم عند تجميع الكود
، ولا يتم ضبطه عند تشغيل البرنامج.
لا يتغير ديناميكيًا.
باستخدام وظائف تخصيص الذاكرة الديناميكي ، يمكنك الحصول على مساحة التخزين التي تحتاجها.
يمكّنك هذا الأسلوب من تخصيص الذاكرة أثناء تنفيذ البرنامج.
لذا فكر في مزايا هذا. بادئ ذي بدء ، لا تنشئ قدرًا
كبيرًا من الذاكرة التي قد لا تستخدمها
، بل ستقوم فقط بإنشاء ما تحتاج إليه.
وإذا كنت بحاجة إلى المزيد ، يمكنك تخصيص المزيد.
لا يتعين عليك الرجوع وإعادة التجميع وتغيير الحجم.
لذا فإن تخصيص الذاكرة الديناميكي هو السبيل للذهاب.
يعتمد ذلك على مفهوم المؤشر ويوفر حافزًا قويًا
لاستخدام المؤشرات في التعليمات البرمجية الخاصة بك.
لذلك تحدثنا عن مزايا المؤشرات وربما تكون
قد فكرت في نفسك جيدًا ، حسنًا ، إنها مفهوم رائع ولكن لماذا نحتاج
إلى استخدامها ، هذا أحد الأسباب
الكبيرة ، بحيث يمكنك تخصيص الذاكرة ديناميكيًا.
ومرة أخرى ، ما هذا - إن لغة C تدور حول كونها لغة فعالة ولا تستخدم
قدرًا كبيرًا من الذاكرة.
لذا ، يعمل c على الأنظمة المضمنة ، والبرمجة في الوقت الفعلي
، وهذا أحد أسباب ذلك لأنه يمكنك تحديد مقدار الذاكرة التي تستخدمها
بناءً على الحاجة.
لذا فإن تخصيص الذاكرة الديناميكي يسمح بتخصيص الذاكرة لتخزين البيانات ديناميكيًا
عند تنفيذ البرنامج.
لا يمكن تخصيص الذاكرة ديناميكيًا إلا
لأن لديك مؤشرات متاحة.
نظرًا لأن لديك عنوانًا ويمكنك تغيير
مقدار المؤشر الذي يشير إليه ، يمكنك إعادة ضبط الذاكرة.
ستستخدم غالبية برامج الإنتاج تخصيص الذاكرة الديناميكي.
إذا كنت تكتب رمزًا في c ، فستستخدم هذا.
حتى لو كنت مبتدئًا ، فستستخدم تخصيص
الذاكرة الديناميكي. معظم البرامج المفيدة ستوظف هذا المفهوم.
يتيح لك تخصيص البيانات ديناميكيًا إنشاء مؤشرات في وقت التشغيل
تكون كبيرة بما يكفي للاحتفاظ بكمية البيانات التي تحتاجها للمهمة
، حتى لا تهدر الذاكرة. حيوي.
علينا أيضًا أن نتحدث عن الكومة مقابل المكدس.
هناك طريقتان يمكنك من خلالهما تخزين الذاكرة في أحد البرامج ، وهما بنيتان
مختلفتان للبيانات يمكنك من خلالهما تخزين البيانات على المكدس أو يمكنك تخزين البيانات
على الكومة.
يحجز تخصيص الذاكرة الديناميكي كل شيء في الكومة.
لن نخوض في تفاصيل كيفية تنظيمها ولكن بشكل أساسي.
عندما تقوم بتخزين البيانات على الكومة ، فإنها تسمح بمزيد
من التغيير.
يمكنك تغيير حجم كائنات البيانات بشكل تعسفي وتبقى
لفترة أطول عندما تخصص الذاكرة في كومة ،
فإنها تلتصق بكامل برنامجك.
عندما تستخدم مكدسًا ، يكون الأمر أكثر تقييدًا.
يتم استخدام المكدس لكل شيء بدءًا من وسيطات الوظيفة والمتغيرات المحلية.
هذا هو المكان الذي يتم فيه تخزين كل شيء.
ولهذا السبب تحدثنا عن مكدس المكالمات.
نظرت في الأساليب
والوظائف. أستخدم الأساليب بين الحين والآخر ، لكن الأساليب هي حقًا مصطلح موجه
للكائنات ، لذا فهي وظائف.
يتم إنشاء كل ما يتعلق بالوظائف على المكدس.
إذن ما يعنيه هذا هو أنه عند تنفيذ
وظيفة ، يتم وضعها في المكدس. يتم وضع المتغيرات المحلية على المكدس.
عند الخروج من الوظيفة ، يتم حذف كل شيء.
لذا فإن الذاكرة الموجودة على المكدس لا تستمر لفترة طويلة.
هذا أحد الأسباب التي تجعلك تخصص الذاكرة ديناميكيًا
في الكومة لأنك تتحكم
في وقت استخدامها وعندما لا تستخدمها ، فإنك تخصصها وتحذفها.
الأشياء الموجودة على المكدس ، لا يمكنك التحكم بها. يتم حذفه تلقائيًا ، ويتم
تخصيصه تلقائيًا.
لذا فإن المتغيرات المحلية ، المتغيرات داخل وظائف مثل main
، يتم إنشاؤها على المكدس وما إلى ذلك.
الذاكرة الموجودة على الكومة مختلفة ، يتحكم فيها المبرمج أنت.
عندما تقوم بتخصيص ذاكرة على الكومة ، فإن الأمر متروك لك لتتبع الوقت الذي لم تعد فيه الذاكرة
التي قمت بتخصيصها مطلوبة ، لذلك عليك حذف الذاكرة.
يجب عليك تحرير المساحة
عندما لم تعد تستخدمها. وهذا مهم لأن الذاكرة
مورد نادر للغاية.
اليوم لدينا الكثير من الذاكرة التي يمكنك من خلالها تشغيل جهاز كمبيوتر
، 12 عربة ، 16 عربة مهما كان. لكن بالنسبة للبرامج المضمنة
التي تعمل على الأجهزة ، ليس لديك هذا القدر من
الذاكرة بالضرورة. ولذا فأنت تريد التحكم في مقدار استخدام الذاكرة
وتريد أيضًا تحرير الذاكرة عند الانتهاء من استخدامها حتى تتمكن التطبيقات
الأخرى من استخدامها.
مرة أخرى ، أكثر أهمية في أنظمة الكتابة المدمجة منخفضة المستوى.
لكن هذه حرية لا تتمتع بها العديد من اللغات. هذه القدرة على التحكم
في ذاكرة مديرك بواسطة المبرمج ، ويمكن أن تجعل
البرنامج أكثر كفاءة وأسرع بكثير.
لذا في المحاضرة التالية ، سنتحدث عن كيف يمكنك فعل ذلك
، ما هي الوظائف التي يمكنك استدعاؤها. من الواضح أن هناك وظائف مختلفة يمكنك الاتصال
بها لتخصيص الذاكرة في الذاكرة الخالية. شكرًا لك.