SORU
29 EYLÜL 2008, PAZARTESİ


Neden't C çöp toplayıcı yok?

Tüm çöp toplama esası ilk nedeniyle bu soruyu soruyorum. Bunu sorduğum için benim ana nedeni Bjarne Stroustrup C zaman içinde bir noktada bir çöp toplayıcı sahip olacağını söyledi biliyorum.

Bunu dedi, neden ilave edilmedi? Zaten C için bazı çöp toplayıcıları vardır . Bu sadece bir "söylemesi kolay" türü şeyler? Ya da (C ve 11 eklenmeyecek) eklendi olmadı başka nedenler var mı?

Çapraz bağlantılar:

DÜZENLEME:Sadece netleştirmek için, C ilk yaratıldığında bir çöp toplayıcı yoktu nedenlerini anlıyorum. Toplayıcı eklenebilir mi merak ediyorum.

CEVAP
24 ŞUBAT 2010, ÇARŞAMBA


Tartışma burada eklemek için.

Çöp toplama ile ilgili sorunlar vardır, ve onları anlama C olmadığını neden anlamak yardımcı olur .

1. Performans ?

İlk şikayet genellikle performansı hakkında, ama çoğu insan gerçekten onlar hakkında neler konuştuğunu farkında değil. Martin Beckett gösterildiği gibi sorun se, ama performans öngörülebilirlik başına performans olmayabilir.

Şu anda yaygın olarak dağıtılan GC 2 aile var:

  • İşaretle-Süpür tür
  • Başvuru Sayma tür

Mark And Sweep Daha hızlı (daha az etkisi üzerinde genel performans) ama acı bir "Dur dünya" sendromu: yani ne zaman GC devreye girer, her şey durdu ve GC vardır para temizleme. Eğer birkaç milisaniye içinde cevap veren bir server kurmak isterseniz... bazı hareketleri beklentilerinizi kadar canlı :)

Reference Counting sorunu farklı: referans sayma yükü, özellikle bir atom sayısına sahip olduğu için, Çoklu ortamlarda ekler. Ayrıca bu döngüleri tespit etmek ve onları ortadan kaldırmak için akıllı bir algoritma gerekir, bu yüzden referans devir sorunu (genellikle uygulamaya "dur dünya" da daha az) sık olsa. bir tarafından var Bugün itibariyle, genel olarak, bu tür normalde daha duyarlı ya da daha doğrusu, donma daha az sıklıkta olsa bile) Mark And Sweep daha yavaştır.

"Dünya" yönü. Donma olmadan Mark And Sweep benzer küresel bir performans olurdu Reference Counting Çöp Toplayıcı uygulamaya çalışıyorlardı Eyfel uygulayıcıları tarafından bir kağıt gördüm bir (Tipik) GC için ayrı bir konu gerekli. Algoritma biraz korkutucu (en sonunda) ama kağıttan yapılmış iyi bir iş tanıtımı kavramları birer birer gösterip evrim algoritması "basit" sürümü için tam teşekküllü bir. Ellerimi geri PDF dosyasını koyarım... tavsiye okuma

2. Kaynakları Toplama Başlatma

Düzgün serbest olmasını sağlamak için bir nesne içinde kaynakları sahipliğini almanız olacaktır C ortak bir dil. Çöp toplama olmadığı için çoğunlukla bellek için kullanılan, ama aynı zamanda yine de diğer durumlar için çok yararlı

  • (multi-thread, dosya tanıtıcı, ...) kilitler
  • (bir veritabanı başka bir sunucu,...) bağlantıları

Fikri düzgün nesnenin yaşam süresini kontrol etmek için:

  • hayatta istediğin kadar olmalıdır
  • bu bitince öldürmüş olmalı

GC sorunu, eski ile yardımcı olur ve nihayetinde daha sonra garanti ederseniz... "son" yeterli olmayabilir. bu yani Eğer bir kilit bırakırsanız, çok daha ileriye aramaları engellemez böylece artık serbest, bu çok hoşuna giderdi!

GC ile çalışma alternatif yollarını iki dil var:

  • ayırma yığın GC kullanmayın yeterlidir: normalde performans sorunları için değil, ama bizim durumumuzda bu kapsam ömrü tanımladığı için gerçekten yardımcı olur
  • using inşa... ama açık (zayıf) DEMİRYOLU C iken DEMİRYOLU kullanıcı farkında olmadan hata YAPAMAZ, böylece örtülü (using anahtar unutulduğunda)

3. Akıllı İşaretçiler

Akıllı işaretçileri genellikle gümüş bir kurşun gibi C bellek işlemek için görünür. Sık sık duydum times: akıllı işaretçiler olduğumuz için GC sonra tüm ihtiyacımız yok.

Daha yanlış olamazdı.

Akıllı işaretçiler yardım yapın: auto_ptr unique_ptr DEMİRYOLU kavramları kullanmak, son derece yararlı gerçekten. Kendi başına oldukça kolay onları yazabilirsiniz bu kadar basit.

Birden çok iş parçacığı arasında payı olabilir ve Kont ele kaç ince sorunlar var. daha fazla zorlaşıyor ancak bir mülkiyet payı gerekiyor: Bu nedenle, bir doğal shared_ptr doğru gider.

Harika bir şey bu sonuçta. ama bir gümüş kurşun değil. Aslında shared_ptr ile ana sorun, GC Reference Counting tarafından uygulanan öykünen ama döngü algılama uygulamak için ihtiyacınız olan tek başına... Urg

Elbette var weak_ptr bir şey, ama ne yazık ki daha önce görmediği bir bellek sızıntısı rağmen kullanımı shared_ptr çünkü o devir... ve zaman içinde bir Çok iş Parçacıklı ortamda, son derece zor algılamak için!

4. Çözüm nedir ?

Gümüş kurşun yok, ama her zaman olduğu gibi, kesinlikle mümkün değil. GC yokluğunda mülkiyet konusunda net olmak lazım:

  • mümkünse, belirli bir anda tek bir sahibi olması tercih
  • değilse, sınıf diyagramı herhangi bir döngüsü mülkiyete ait olduğundan emin olun ve weak_ptr ince uygulama ile onları kırmak

Gerçekten de, bir GC için çok iyi olur... ancak önemsiz bir konu. Ve bu arada, biz sadece kollarımızı sıvayalım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cdgotx

    cdgotx

    8 Kasım 2011
  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • gamingbits

    gamingbits

    2 Mayıs 2006