[C++] راي مقابل جامع القمامة


Answers

جمع القمامة يحل فئات معينة من مشاكل الموارد التي راي لا يمكن حلها. في الأساس، فإنه يتلخص في تبعيات دائرية حيث كنت لا تحدد دورة قبل اليد.

وهذا يعطيها ميزتين. أولا، سوف تكون هناك أنواع معينة من المشكلة التي راي لا يمكن حلها. هذه، في تجربتي، نادرة.

وأكبر واحد هو أنه يتيح للمبرمج أن يكون كسول ولا يهتمون عمر الموارد الذاكرة وبعض الموارد الأخرى التي لا تمانع تأخر تنظيف على. عندما لا يكون لديك لرعاية أنواع معينة من المشاكل، يمكنك رعاية أكثر عن مشاكل أخرى. هذا يتيح لك التركيز على أجزاء من المشكلة التي تريد التركيز عليها.

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

ولكي نكون منصفين، فإن إدارة الموارد في C ++ تأخذ الكثير من العمل الذي يجب القيام به بشكل صحيح في مثل هذه النظم المعقدة الكبيرة (بدون دورة). C # واللغات المماثلة مجرد جعلها أكثر صعوبة أصعب، في المقابل أنها تجعل من السهل حالة سهلة.

وتؤدي معظم عمليات تنفيذ اتفاقية جنرال الكتريك أيضا فئات غير محلية كاملة؛ وخلق مخازن متجاورة من الكائنات العامة، أو إنشاء كائنات عامة في كائن واحد أكبر، ليس شيئا أن معظم تطبيقات غ جعل من السهل. من ناحية أخرى، C # يسمح لك لخلق قيمة نوع struct s مع قدرات محدودة إلى حد ما. في العصر الحالي من العمارة وحدة المعالجة المركزية، وذاكرة التخزين المؤقت الود هو المفتاح، وعدم وجود قوات غ المحلية هو عبئا ثقيلا. وبما أن هذه اللغات لها وقت تشغيل بيتيكود في معظمها، من الناحية النظرية يمكن للبيئة جيت نقل البيانات شائعة الاستخدام معا، ولكن في كثير من الأحيان كنت مجرد الحصول على فقدان الأداء موحد بسبب مخبأ مخبأ متكررة مقارنة C ++.

المشكلة الأخيرة مع غ هو أن ديالوكاتيون غير محدد، ويمكن أن يسبب في بعض الأحيان مشاكل في الأداء. جعلت غس الحديثة هذا أقل من مشكلة مما كانت عليه في الماضي.

Question

شاهدت مؤخرا حديث عظيم من قبل هيرب سوتر حول "تسرب C ++ مجانا ..." في كبكون 2016 حيث تحدث عن استخدام مؤشرات الذكية لتنفيذ راي (اكتساب الموارد هو التهيئة) - مفاهيم وكيفية حل معظم القضايا تسرب الذاكرة.

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




تحدث تقريبا. قد تكون لغة راي أفضل للكمون والارتعاش . قد يكون جامع القمامة أفضل من أجل إنتاجية النظام.




جمع القمامة و راي كل دعم بناء مشترك واحد الذي الآخر غير مناسب حقا.

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

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

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

ولأن لا غ و راي يعالجان جميع السيناريوهات بشكل جيد، سيكون من المفيد للغات تقديم دعم جيد لكل منهما. لسوء الحظ، واللغات التي تركز على واحد تميل إلى علاج الآخر باعتباره فكرة لاحقة.




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




راي و غ حل المشاكل في اتجاهات مختلفة تماما. فهي مختلفة تماما، على الرغم من ما يقوله البعض.

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

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

  • C ++ تقدم راي من خلال منشئات / ديستروكتورس و غ من خلال shared_ptr (إذا كنت قد جعل الحجة التي ريفكونتينغ و غ هي في نفس الفئة من الحلول لأنها مصممة على حد سواء لمساعدتك لا تحتاج إلى إيلاء الاهتمام لحياة)
  • بيثون تقدم راي من خلال with و غ من خلال نظام ريفكونتينغ بالإضافة إلى جامع القمامة
  • C # العروض راي من خلال إديسبوسابل using و غ من خلال جامع القمامة الأجيال

الأنماط تزرع في كل لغة.