SORU
17 ŞUBAT 2011, PERŞEMBE


Ne Uygulamaları mevcuttur İşaretçi Akıllı C?

Kullanma zamanı karşılaştırmaları, Artıları, Eksileri, ve?

Bu düşündüğümden de basit bir soru, belirli bazı akıllı işaretçi uygulamaları hakkında yorumlar bir sürü oluşturulan yeni bir yazı başlangıç değer görünüyordu nereye spin-off garbage collection thread.

Sonuçta soru C akıllı işaretçiler çeşitli uygulamaları oraya nasıl farkları nelerdir? Başka düşündüğün bir şey için sadece basit artıları ve eksileri ya da özel durumlar ve sorunlar çalışmalıdır.

Yayınladım bazı uygulamaları kullandığım ya da en azından bi ve kabul olarak kullanarak cevap aşağıda ve benim anlayış farklılıkları ve benzerlikleri olan olmayabilir 0 doğru çok rahat aslında kontrol veya doğru beni gerektiği gibi.

Amaç bazı yeni nesneler ve kütüphaneler hakkında bilgi edinmek veya mevcut uygulamalarının kullanımı ve benim anlayışıma göre zaten doğru yaygın olarak kullanılan ve diğerleri için iyi bir referans ile sonuna kadar.

CEVAP
17 ŞUBAT 2011, PERŞEMBE


C 03

std::auto_ptr - ilk taslak sendromu sadece sınırlı çöp toplama imkanı sağlayan muzdaripti orijinalleri Belki de. İlk dezavantajı bozma delete dizisi ayrılmış nesneleri tutmak için kabul edilemez hale çağıran (new[]). İki otomatik işaretçiler aynı nesne bulunmamalıdır. yani işaretçi sahipliğini alır. Atama mülkiyet transferi ve sıfırlarrvaluebir null işaretçi için otomatik işaretçi. Belki de en büyük dezavantajı; kopyalanması söz konusu yetersizlik nedeniyle STL kapları içinde kullanılabilir mi yol açar. Herhangi bir kullanma durumu son darbenin C sonraki standart kaldırılmış olması planlanan olmasıdır .

std::auto_ptr_ref - Bu aslında bir tasarım detayı std::auto_ptr ile birlikte kullanıldığında, bazı durumlarda kopyalama ve atama izin akıllı bir işaretçi değildir. Özellikle bir non-sabit std::auto_ptr dönüştürmek için kullanılabilirlvalueColvin-Gibbons hile aynı zamanda bir olarak bilinen kullanarak 72* *devretmek için.

Belki de std::auto_ptr çok genel amaçlı olarak kullanılmak üzere tasarlanmış değildi aksine Akıllı Otomatik çöp toplama için işaretçi. Sınırlı anlayış ve varsayımlar en Herb Sutter's Effective Use of auto_ptr temel alır ve her zaman en iyi şekilde olmasa da düzenli olarak kullanmak istiyorum.


C 11

std::unique_ptr - Bu anahtar iyileştirmeler dışında oldukça benzer olacak std::auto_ptr dizilerle çalışmak gibi std::auto_ptr zayıf yönleri düzeltmek yerine, olacak olan arkadaşımızlvalueözel kopya kurucu, STL kapları ve algoritmaları ile kullanılabilir olma, üzerinden koruma vb. Yükü ve bellek ayak izi sınırlıdır performans olduğu için bu değiştirme, ya da belki daha uygun bir şekilde sahip, ham işaretçi açıklandığı için ideal bir aday. "Eşsiz" std::auto_ptr önceki gibi. işaretçi tek bir sahibi var da anlaşılacağı gibi

std::shared_ptr - bu TR1 ve boost::shared_ptr kapalı dayanır ama aliasing ve işaretçi aritmetiği de içerecek şekilde geliştirilmiş inanıyorum. Kısacası bir referans bir dinamik olarak ayrılan nesne etrafında sayılan akıllı işaretçi sarar. Son paylaşılan işaretçi son başvuru kapsam dışına çıkarsa nesne uygun. silinir o zaman "işaretçi birden fazla paylaşılan işaretçi tarafından sahip olması anlamına gelir" ortak olarak Bu da iş parçacığı güvenlidir ve çoğu durumda eksik türleri işleyebilir. std::make_shared verimli bir yığın std::shared_ptr bir ayırma varsayılan ayırıcı kullanarak oluşturmak için kullanılabilir.

std::weak_ptr - Aynı şekilde TR1 kapalı tabanlı ve boost::weak_ptr. Bu bir nesne std::shared_ptr a ait başvuru olduğunu ve bu nedenle eğer std::shared_ptr başvuru sayısı sıfıra düşerse nesnenin silinmesini engellemez. Sipariş erişmek için ham işaretçi ilk ihtiyacı erişim std::shared_ptr arama lock döndürür boş bir std::shared_ptr ait işaretçi sona ermiş ve bir süredir yok zaten. Bu çok akıllı işaretçileri kullanırken belirsiz asılı başvuru sayıları önlemek için kullanışlıdır.


Boost

boost::shared_ptr - en farklı senaryolarda kullanmak için Muhtemelen en kolay (STL, PİMPL, DEMİRYOLU, vb.) Bu paylaşılan başvurulan sayılır akıllı bir işaretçi. Bazı durumlarda performansı ve yükü hakkında bir kaç şikayet duydum ama argümanın ne olduğunu hatırlamıyorum çünkü onları göz ardı etmiş olmalıyım. Anlaşılan bekleyen standart C nesnesi ve norm akıllı işaretçiler ile ilgili hiçbir sakıncaları akla gelen olmak için yeterince popüler oldu.

boost::weak_ptr - std::weak_ptr bu uygulamaya dayanan, bu boost::shared_ptr bir non-sahibi bir referans sağlar önceki açıklama gibi. Size şaşırtıcı değil "güçlü" işaretçi paylaşılan ve çoktan yok olmuş olabilir. geçerli olduğundan emin olmak için kontrol etmelisiniz erişim lock() çağrı Sadece emin olun deposu paylaşılan gösterici döner istiyorum kapsam olarak işin bitti yoksa haklısın geri döngüsel başvuru sorunu nereye başvuru sayıları Asar ve nesneleri olmayacak yok.

boost::scoped_ptr - Bu küçük yükü büyük bir olasılıkla kullanılabilir boost::shared_ptr daha iyi bir performans sunmak için tasarlanmış basit akıllı işaretçi bir sınıf. Özellikle güvenli bir şekilde aynı nesne için birden fazla işaretçiler ile STL kapsayıcı bir unsur olarak ya da kullanılabilir değil aslında std::auto_ptr karşılaştırılabilir.

boost::intrusive_ptr - bunu hiç kullanmadım ama anladığım kadarıyla kendi akıllı işaretçi uyumlu sınıfları oluştururken kullanılmak üzere tasarlanmıştır. Başvuru Kendin sayma uygulamak gerekir, Ayrıca eğer sınıf genel olmasını istiyorsanız birkaç yöntemleri uygulamak gerekir, ayrıca kendi iş parçacığı güvenliği uygulamak gerekiyor. Artı tarafta, bu muhtemelen toplama ve küçük "" seni istiyorum. şıklığı nasıl tam olarak seçerek en özel şekilde verir intrusive_ptr nesne tek başına bir yığın tahsisi için izin beri genellikle shared_ptr daha etkilidir.(teşekkürler Arvid)

boost::shared_array - Bu diziler için boost::shared_ptr. Temelde 35*, operator[], *ve elbette delete [] pişmiş. Bu STL kapları kullanılabilir ve bildiğim kadarıyla yok boost:shared_ptr boost::weak_ptr kullanamazsınız, ancak bu her şeyi yok. Ancak alternatif olarak benzer işlevler için boost::shared_ptr<std::vector<>> kullanım ve başvuruları için boost::weak_ptr kullanma yeteneğini yeniden kazanmak için.

boost::scoped_array - Bu diziler için boost::scoped_ptr. boost::shared_array ile olarak gerekli tüm dizi, iyi pişmiş. Bu non-copyable ve STL kapları kullanılabilir. Muhtemelen sadece std::vector bunu kullanmak isteyen kendinizi bulmak hemen hemen her yerde buldum. Aslında hiçbir zaman daha hızlı ya da daha az yük olan, fakat en kapsamlı dizi STL bir vektör daha az yer gibi görünüyor bu tesbit ettim. Bu ayırma tutmak istediğinizde yığını boost::array yerine düşünün.


Qt

QPointer - bu bir "sadece Qt olan QObject ve türetilmiş sınıflar ile çalışır." işaretçi akıllı zayıf Qt 4.0 Tanıtıldı ^em>neredeysegerçekten bir sınırlama değil her şey. Ancak orada sınırlamalar yani o değil kaynağı bir "güçlü" işaretçi ve rağmen kontrol edebilirsiniz eğer altta yatan bir nesne geçerli isNull() seni bulamayacağı bir nesne yok olmasının hemen ardından Geçiş Kontrol, özellikle çok kanallı ortamlar. Qt insanlar bu sanırım kaldırılmış düşünün.

QSharedDataPointer - Bu bir "güçlü" akıllı işaretçi potansiyel olarak karşılaştırılabilir boost::intrusive_ptr olsa da bazı yerleşik iş parçacığı güvenliği ama yok iste senin için vardır referans sayım yöntemleri (ref deref) yapabilirsin işlemek QSharedData. Qt çoğu gibi nesneleri en geniş devralma yoluyla kullanılan ve her şeyi dizayn gibi görünüyor sınıflara.

Örtülü olarak detach() çağrı olamıyor QExplicitlySharedDataPointer - QSharedDataPointer Çok benzer. Tam olarak başvuru sayısı sıfıra düşer sonra ayırmak için kontrol hafif artış gibi QSharedDataPointer 2.0 özellikle de değmez bu sürüm tamamen yeni bir nesne diyebilirim.

QSharedPointer - Atom, başvuru sayma, iş parçacığı güvenli, paylaşılabilir işaretçi, özel siler (dizi destek), akıllı bir işaretçi olması gereken her şeye benziyor. Ben öncelikle Qt akıllı bir işaretçi olarak kullanımı ve boost:shared_ptr ile karşılaştırılabilir önemli ölçüde daha fazla Qt bir çok nesne gibi havai rağmen muhtemelen buluyorum.

QWeakPointer - bir yinelenen desen hissediyor musun? Sadece std::weak_ptr boost::weak_ptr aksi takdirde bu nesneler asla silinmesine neden olacak iki akıllı işaretçileri arasında başvurular ihtiyacınız olduğunda QSharedPointer ile birlikte kullanılır.

QScopedPointer - Bu ismi de tanıdık geliyor ve aslında ortak ve zayıf işaretçiler Qt sürümleri aksine boost::scoped_ptr dayalı aslında. Bu fonksiyonları sağlamak için bir tek sahibi akıllı işaretçi olmadan yük QSharedPointer hangisi daha uygun uyumluluk, güvenli özel durum kodu ve her şeyi kullanabilirsiniz std::auto_ptr boost::scoped_ptr için.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matthew Smith

    Matthew Smit

    24 Mayıs 2010
  • SomeOne Pro

    SomeOne Pro

    25 EKİM 2013
  • Vsauce

    Vsauce

    30 Temmuz 2007