في عملية رمز النقل من C ++ إلى Delphi ، غالبًا ما يتعين على رمز المنفذ باستخدام مجموعات STL. مجموعة المجموعات التي تقدمها دلفي زاهد للغاية وبالتالي في بعض الأحيان
من الصعب العثور على بديل مناسب. في بعض الأحيان ، تصادف الكود حيث يتم وضع الكائن في المكدس أو يستخدم مخصص الذاكرة الخاص به.
أنا حقا لا أحب وضع تحديث البيانات المقترح. لتحديث البيانات ، أحتاج إلى استرداد القيمة الموضوعة فيها من المجموعة ، وتحديث القيمة ثم إعادة القيمة التي تم تغييرها. هذا يتطلب ما لا يقل عن عمليتين نسخ إضافيين. لا يمكننا تمرير عنصر البيانات كمعلمة VAR إلى إجراء.
لا توجد طريقة لتغيير مجموعة كيفية تخصيص الذاكرة. يتم تخصيص ذاكرة الكائنات والسجلات من كومة مشتركة واحدة. بعد الاستخدام ، يجب إرجاع الذاكرة بعناية إلى الكومة. إن تحرير الذاكرة بشكل صحيح ليس دائمًا مهمة تافهة ، ويستغرق الأمر وقت المعالج ووقت المبرمج لكتابة هذا الرمز. في STL ، يمكنك تحديد مخصص الذاكرة الخاص بك لجميع أنواع المجموعات.
يعتمد هذا التنفيذ على السجلات والمؤشرات. حتى الآن ، لا أرى أي طريقة لتنفيذ ما أريد باستخدام كائنات قياسية. يستخدم إنشاء وتدمير الكائنات كومة مشتركة من الذاكرة. لا توجد طريقة لوضع الكائنات على مكدس المكالمات. تم إعلان "الكائن" القديم الجيد إهماله وإضافة ميزات جديدة لهذا النوع غير مدعوم.
يعتمد تطبيق المجموعة هذا على إدارة الذاكرة للآلية استنادًا إلى مناطق الذاكرة المكتوبة. إن استخدام مناطق الذاكرة المكتوبة يجعل من الممكن تبسيط حل عدد من المهام:
تصبح مهمة تحرير الذاكرة أسهل ويمكن القيام بها بشكل أسرع.
إنها حقيقة معروفة أن مدير الذاكرة القياسي يجب أن يكون آمنًا لخيط الخيط. يمكن لخيط واحد فقط الوصول إلى مدير الذاكرة في أي وقت معين. يستخدم تخصيص وتخفيف الذاكرة آليات الاستبعاد المتبادل وليس عملية سريعة ، خاصةً إذا كانت الذاكرة محملة بشدة. عند استخدام منطقة ذاكرة منفصلة مكتوبة ، نشير إلى مدير الذاكرة القياسي فقط في لحظة زيادة الذاكرة المطلوبة وحذف الهيكل بعد استخدامه.
دعم الهياكل الأساسية مع القدرة على تحديد مخصص الذاكرة. يتم الوصول إلى عناصر القائمة من خلال المؤشرات. كقاعدة عامة ، توجد ذاكرة القيم في ما يسمى منطقة الذاكرة المجزأة ، والتي لن يتم نقلها أثناء التشغيل. إذا كان من الضروري زيادة ذاكرة المنطقة ، يتم تخصيص جزء إضافي للذاكرة لذلك. هذا يعني أنه يمكننا الوصول إلى عناصر البيانات الموجودة في مثل هذه المنطقة من خلال مؤشر.
بالنسبة للصفائف ، نستخدم ما يسمى منطقة الذاكرة المتجاورة. يتم الوصول إلى عناصر البيانات من خلال فهرس. إذا لزم الأمر ، قم بزيادة ذكرى المنطقة ، يتم تخصيص قطعة ذات حجم كبير لها ويتم نسخ البيانات من قطاع الذاكرة الحالي إلى الجزء الجديد. بعد نسخ البيانات ، سيتم حذف الجزء القديم.
في نهاية المطاف ، العمل من خلال المؤشرات مريحة للغاية وفعالة. يصبح الرمز أبسط بكثير وأكثر إيجازًا. ومع ذلك ، إذا لم تكن لديك خبرة مع المؤشرات ، فمن السهل "إطلاق النار على نفسك في القدم". لمحبي التغليف ، يمكنك تجميع الهيكل المطلوب كحقل خاص. بعد ذلك ، نفتح فقط الجزء اللازم من الواجهة من خلال تجاوز الأساليب والخصائص المطلوبة في القسم العام. إذا وضعنا الخيار المضمّن ، فإننا نتجنب تكاليف إضافية. لن يقوم برنامج التحويل البرمجي Delphi بإنشاء رمز للطرق المتطورة. في مكان استدعاء الطريقة ، ستكون هناك مكالمة مباشرة إلى طريقة الهيكل الكلي.
TsgTuple<T1, ...> tuples عامTsgArray<T> صفيف عام مع تخصيص الذاكرة من منطقة ذاكرة مشتركةTsgList<T> قائمة عامة للقيمTsgRecordList<T> قائمة عامة بالقيم التي يتم الوصول إليها بواسطة المؤشرTsgLinkedList<T> قائمة مرتبطة ثنائية الاتجاه العامةTsgForwardList<T> قائمة مرتبطة بعنوان عامTsgHashMap<Key, T> القاموس العام غير المرتبةTsgMap<Key, T> قاموس مرتبة عامة على أساس 2-3 شجرةTsgSet<Key> مجموعة عامة على أساس 2-3 أشجارTsgPointerArray قائمة غير طبقة من المؤشراتTsgPointerList قائمة غير طبقة من القيم التي يمكن الوصول إليها بواسطة المؤشرTCustomLinkedList قائمة مرتبطة ثنائية الاتجاه غير طبقةTsgCustomTree غير الطبقي على أساس 2-3 أشجار لقد بدأنا إضافة تكرار Delphi. الآن يمكننا استخدام البناء for p in List do; الشيء الأكثر إثارة للاهتمام هو أننا نستخدم السجل لتنفيذ التكرار ويعمل! بالمقارنة مع استخدام الكائنات ، يكون الرمز الذي تم إنشاؤه أكثر كفاءة ، وهو لطيف ، لا توجد مكالمات إلى الكومة ، يوجد المتغير للمؤلف على المكدس. تبين أن هذا مفاجأة سارة بالنسبة لي!
تعني القدرة على تحديد مخصص الذاكرة أيضًا أننا نعمل بشكل أساسي مع السجلات. عادةً ما تستخدم بعض الهيكل منطقة ذاكرة واحدة أو أكثر ، وهي مدير ذاكرة بسيط. بعد استخدام الهيكل ، لدينا الفرصة لإرجاع جميع الذاكرة التي تشغلها تحرير منطقة الذاكرة. لدينا قيود باستخدام الميراث. في بعض الحالات ، يمكننا استبدال الميراث بالتجميع والمساعدين. عادة لتنفيذ المجموعات ، هذه ليست مشكلة. استخدام السجلات يسمح بالتكديس المجموعات. هذا في بعض الأحيان مريح للغاية.
يتيح لك تجمع الكائنات إدارة إعادة استخدام الهياكل عند إنشاء كائنات كثيفة الذاكرة أو عندما يمكن إنشاء عدد محدود من الكائنات من نوع معين.
إذا توقفنا عن استخدام شيء ما ، فلا يستحق دائمًا حذف الهيكل أو الكائن. في كثير من الأحيان يجب إعادة إنشاء الكائن.