2011-01-09 25 views
12

C++ 'da bir oyun motoru kütüphanesi yapıyorum. Bir süre önce bir uygulama oluşturmak için Qt kullanıyordum ve Implicit Sharing kullanımını oldukça etkilemiştim. Kimsenin bu tekniği daha detaylı açıklayabileceğini veya bunun basit bir örneğini sunabileceğini merak ediyorum.örtülü paylaşım nedir?

+5

Nasıl çalıştığına dair mükemmel bir açıklama sağlayan dokümanlar için bir bağlantı verdiniz. Hatta, [çok iş parçacıklı uygulamalarda atomik referans sayımının nasıl yardımcı olduğunu açıklayan iş parçacıklı dokümanlar] için bir referansı bile vardır (http://doc.trolltech.com/latest/threads-modules.html#threads-and-implicitly-shared-classes). Bir şey hala belirsiz ise, bunun hakkında daha ayrıntılı bir soru sormalısınız. Ve unutma ki daima QT'nin kaynaklarına bakabilirsin. –

+0

* örtülü paylaşım * için başka bir ad * copy-on-write *. Bu diğer adı sorarak SO üzerinde soran sorulara bir göz atmak isteyebilirsiniz: http://stackoverflow.com/questions/628938/what-is-copy-on-write –

+0

Gizli paylaşımın sadece Qt olduğuna inanıyorum [Yazma üzerine] (https://en.wikipedia.org/wiki/Copy-on-write) uygulanması. – HelloGoodbye

cevap

31

örtülü paylaşımın arkasındaki temel fikir, daha yaygın olan kopyala yazarken kullanılan terimini kullanmaktır. Yazılıma yazmanın ardındaki fikir, her nesnenin gerçek uygulama için bir işaretçi etrafında bir sarıcı görevi görmesini sağlamaktır. Her uygulama nesnesi, işaretçi sayısını izler. Sarıcı nesne üzerinde bir işlem gerçekleştirildiğinde, bu, gerçek çalışma yapan uygulama nesnesine iletilir.

Bu yaklaşımın avantajı, bu nesnelerin kopyalanması ve imha edilmesinin ucuz olmasıdır. Nesnenin bir kopyasını yapmak için, sadece bir sarıcı örneği oluşturuyoruz, işaretçisini uygulama nesnesine işaret edecek şekilde ayarlıyoruz ve daha sonra nesneye işaretçi sayısının sayısını artırıyoruz (bu bazen referans sayısı olarak adlandırılıyor) Bu arada. Tahribat benzerdir - referans sayımını birer düşeriz, daha sonra uygulamaya başka birinin işaret edip etmediğine bakın. Yoksa, kaynaklarını serbest bırakırız. Aksi takdirde, hiçbir şey yapmayız ve sadece bir başkasının daha sonra temizlik yapacağı varsayılır.

Bu yaklaşımdaki zorluk, aynı uygulamanın birden çok farklı nesnenin işaret edeceği anlamına gelmesidir. Bu demektir ki, eğer birisi uygulamada bir değişiklik yaparsa, bu uygulamaya başvuran her nesne değişiklikleri görecektir - çok ciddi bir problem. Bunu düzeltmek için, uygulamayı potansiyel olarak değiştirebilecek herhangi bir işlem gerçekleştirildiğinde, işlem başka bir nesnenin de referans sayısının aynı olup olmadığını görerek uygulamayı referans gösterip göstermediğini kontrol eder. Nesneye başka bir nesne başvurmazsa, o zaman Operasyon sadece devam edebilir - değişikliklerin yayılma olasılığı yoktur. Verileri referans alan en az bir başka nesne varsa, sarıcı ilk önce uygulamanın kendisinin bir kopyasını oluşturur ve işaretçisini yeni nesneyi işaret edecek şekilde değiştirir. Artık biliyoruz ki, herhangi bir paylaşım olamaz ve değişiklikler bir güçlük olmadan yapılabilir.

Bu işlemin bazı örneklerini görmek isterseniz, Stanford's introductory C++ programming course'dan ders örnekleri 15.0 ve 16.0'ya bakın. Bu tekniği kullanarak sözcüklerin bir listesini tutmak için bir nesnenin nasıl tasarlanacağını gösterir.

Bu yardımcı olur umarız!