GC sayımı vs GC'yi izlemek bir dil veya uygulama özelliği midir?


9

Bazen "Swift klasik (izleme) GC yapmaz, ARC kullanır."

Ama Swift anlambiliminde referans sayımı gerektiren bir şey olup olmadığından emin değilim. Görünüşe göre izleme GC'yi kullanmak için kendi Swift derleyicisini ve çalışma zamanını oluşturabilir.

Peki Swift hakkında "referans sayılır" tam olarak nedir? Apple'ın uygulaması mı yoksa dilin kendisi mi? Dilin veya kütüphanenin ARC'yi güçlü bir şekilde destekleyen, dilin kendisi için bu etiketi kullanabileceğimiz kısımları var mı?

Yanıtlar:


9

Swift , bir nesneye yapılan son başvurunun bırakılmasının ardından nesnenin başlatılmasını ve kodun hemen çalıştırılmasını garanti eder deinit.

GC ile bu tür bir garanti almak mümkün değildir - en azından performanstan ödün vermeden. Standart GC mekanizmaları yalnızca deinitkodun nihayetinde çalışmasını sağlar, örneğin bir sonraki GC döngüsünde. Kesin semantik için, bir yerde referans sayısına ihtiyacınız vardır.


3
Ah, bu yüzden deinitbir anahtar kelime ve onunla ilişkili anlambilimin varlığı aslında uygulamadan ziyade dilde kare sayımı yapan şeylerdir.
Ray Toal

2
Hiçbir şey bir GCed çalışma zamanının, bir şey dağıtıldığında erişilemeyen nesneleri kontrol etmesini engellemez. Sadece korkunç derecede verimsiz.
Raphael

@Raphael Bu noktada daha kesin olacak şekilde düzenlendi.
chi

3

chi, vücuttaki hızlı soruya hızlı cevap verdi, bu cevap başlıktaki daha genel soruya cevap veriyor.

GC sayımı vs GC'yi izlemek bir dil veya uygulama özelliği midir?

referans sayma GC ve izleme GC programcıya farklı garantiler sağlar.

Referans sayımı, bir nesnenin yok edildiği program akışındaki konumda determinizm sağlar; bu, nesnenin hızlı bir şekilde serbest bırakılması gereken kıt kaynaklara sahip olması durumunda önemli olabilir. Öte yandan, "güçlü" referansların döngüleri ile başa çıkamaz.

Herhangi bir özellik garanti edilip edilmediği ve bu nedenle uyumlu bir uygulama için hangi seçeneklerin mevcut olduğu ayrı bir dilin özelliğine bağlıdır.


4
Yeniden sayım ve GC'yi birleştirmek de mümkündür. Daha sonra dil, nesnelerin yok edildikleri anda imha edicilerini çalıştırdıklarını (bir şekilde ya da başka bir şekilde yeniden sayım anlamına gelir) ve referans döngülerinin sonunda yok edileceğini (bazı GC türlerini ima eder) belgeleyebilir. Alternatif olarak, uygulama bunu yıkıcılar çalıştırıldığında (IIRC Python ve referans uygulaması örneğidir) garanti etmezken yapabilir, bu durumda bir uygulama özelliği olur.
Gilles 'SO- kötü olmayı bırak'

1

Swift olarak bilinen dili alıp "Swift ile ARC" olarak yeniden adlandırabilirsiniz. Daha sonra, tam olarak aynı sözdizimiyle, ancak nesnelerin ne zaman yer değiştirdiğiyle ilgili daha az garantiyle "Swift ile GC" adında yeni bir dil oluşturabilirsiniz.

ARC'li Swift'te, referans sayısı 0 olduğunda, nesne gidecektir. Çöp toplama ile, zayıf bir referansınız olduğu sürece, bu zayıf referansı, nesneyi "kurtarmak" için güçlü bir referansa atayabilirsiniz. (Swift'te, referans sayısı 0 olduğunda zayıf referanslar sıfırdır); bu büyük bir fark.

Ve elbette Swift ARC ile son referans sayısını öldürmenin nesneyi derhal ele alacağını garanti eder. Örneğin, aynı dosyaya aynı anda iki örnek yazma izninizin olmadığı bir FileWriter sınıfınız olabilir. ARC'li Swift'te oldWriter = nil; newWriter = FileWriter (...) ve yeni FileWriter'ın yalnızca eskisini sildikten sonra oluşturulduğunu bilirsiniz (etrafında başka bir başvuru tutmadıkça); Swift GC ile bu işe yaramaz.

Başka bir fark, "ARC ile Swift" te, sadece güçlü referans çevrimleriyle referans verilen, ancak gerçekte ulaşılamayan nesnelerin yeniden yerleştirilmemesinin garanti edilmesidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.