سؤال

أنا مبرمج C++ هذا تفكر في استخدام د مشروع شخصي كنت تريد أن تلعب حولها مع.أنا أتساءل عما إذا كان هناك وسيلة إلى تعطيل تماما جامع القمامة ، ما هي المخاطر من القيام بذلك.

وأنا أعلم أنني يمكن إدارة بلدي الذاكرة عن طريق تجاوز جديدة وحذف استخدام malloc و الحرة, ولكن إذا فعلت ذلك أنا أفضل أن جامع القمامة لا تعمل على الإطلاق.

هل كانت مفيدة؟

المحلول

لإيقاف GC في D2:

import core.memory;

void main(string[] args) {
    GC.disable;
    // Do stuff.
}

في حالة استخدام D1/فوبوس:

import std.gc;

void main(char[][] args) {
    std.gc.disable;
    // Do stuff.
}

في D1/تانجو:

import tango.core.Memory;

void main(char[][] args) {
    GC.disable;
    // Do stuff.
}

GC يمكن reenabled وبالمثل عن طريق الاتصال GC.تمكين (D2 أو D1/تانجو) أو الأمراض المنقولة جنسيا.gc.تمكين (D1/فوبوس).هذه يمكن القيام به في أي نقطة في البرنامج.داخليا, العداد هو ، في الواقع إعادة تمكين GC, يجب استدعاء تمكين() مرة واحدة في كل مرة تعطيل() كان يسمى.

وإليك بعض الأشياء التي لا علاقة GC المعوقين ، لأنها سوف يسبب تسرب الذاكرة:

  1. لا تستخدم مجموعة إلحاق ( ~= ) المشغل ، أو استخدام .طول خاصية تكبير مجموعة التي تم بالفعل تخصيص.هذه تعتمد على GC إلى تحرير مجموعة من العمر إذا كان يمكن تخصيص, منذ قد يكون هناك التعرج إلى مكان آخر في البرنامج.
  2. لا تستخدم مدمج صفائف النقابي.الطريقة الوحيدة لتحرير هذه هي GC.
  3. معظم فوبوس ، وأعتقد التانغو ، تم تصميمها مع افتراض أن جمع القمامة موجودة.وظائف في هذه المكتبات قد تسرب ذاكرة فظيعة إذا استخدمت w/o GC.
  4. لا تستخدم D2 الإغلاق مع GC المعوقين.(إذا على أي حال ، للعبة.)

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

كملاحظة جانبية ، GC ودليل إدارة الذاكرة يمكن أن تتعايش في د ، في الممارسة العملية ، عند تحسين التعليمات البرمجية يدويا حذف بعض الأجسام الكبيرة مع تافهة عمر يمكن أن يؤدي كبيرة speedups.هذا يمكن القيام به على نحو مماثل C++ باستخدام delete و آمنا حتى لو كان GC تمكين.عندما لم يكن لديك الوقت الحقيقي القيود ، وهذا يعطي لك أكثر من فوائد GC مع أكثر من الأداء من دليل إدارة الذاكرة.

نصائح أخرى

إذا كنت ترغب في استخدام malloc و استخدام مجاني الأمراض المنقولة جنسيا.ج.stdlib.GC لن تلمس هذه. الأمراض المنقولة جنسيا.gc لديه كل الأشياء التي سوف تحتاج لإدارة الذاكرة بما في ذلك تعطيل().

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

GC يجعل كل شيء أكثر إنتاجية مثل مجموعة تقطيع و إنشاء كائنات جديدة في المعلمات دون المتصل متجر إشارة في أي مكان لهم.رمز الجيد هو أقل بكثير من ذلك و مع GC رمز يصبح أصغر كثيرا.

ووGC يمكن إزالتها واستبدالها مع مجمع بسيط حول malloc / الحرة.

كنت أقرأ عن د اللغة وجدت هذا في المواصفات التي يبدو الجديدة في د:

40.أفضل ج

-betterC هو سطر الأوامر العلم dmd الذي يقيد التحويل البرمجي دعم بعض ميزات وقت التشغيل.والجدير بالذكر د البرامج أو المكتبات جمعت مع betterC ليست مرتبطة Druntime.استخدام وقت التحويل البرمجي الميزات ليست مقيدة بأي شكل من الأشكال. https://dlang.org/spec/betterc.html

واحدة من نتائج استخدام سطر الأوامر هذا العلم هو تعطيل GC و ميزات اللغة ترحيل على ذلك.

40.1 العواقب

كما لا Druntime تتوفر العديد من د الميزات لا تعمل.على سبيل المثال:

  • جمع القمامة
  • موضوع التخزين المحلي
  • TypeInfo و ModuleInfo
  • دروس
  • المدمج في خيوط (مثلا ، الأساسية.موضوع)
  • صفائف ديناميكية (ولكن ليس شرائح) و صفائف النقابي
  • استثناءات
  • التبديل مع سلاسل
  • مفتاح النهائي
  • وتزامن الأساسية.المزامنة
  • ثابت وحدة منشئات أو deconstructors
  • البنية deconstructors
  • unittest (اختبار يمكن كالمعتاد مع -betterC العلم)

انظر أيضا https://dlang.org/blog/2017/08/23/d-as-a-better-c/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top