SORU
3 Mart 2014, PAZARTESİ


Neden nesne yerine bir işaretçi kendisi kullanmak gerekir?

Java bir aileden geliyorum ve C nesneleri ile çalışmaya başladı . Ama aklıma bir şey daha sıklıkla örneğin cisimlerin kendileri yerine nesnelere işaretçiler, bu bildirimi kullanın:

Object *myObject = new Object;

yerine:

Object myObject;

Ya da bir fonksiyon kullanmak yerine, hadi testFunc(), şöyle ki:

myObject.testFunc();

yazmalıyız:

myObject->testFunc();

Ama neden bunu bu şekilde yapmamız gerekiyor çözemedim. Bellek adresi doğrudan erişim almak için verimlilik ve hız ile ilgisi var sanıyorum. Haksız mıyım?

CEVAP
3 Mart 2014, PAZARTESİ


Dinamik Ayırma çok sık gördüğüm bu çok talihsiz bir durum. Sadece nasıl gösterir.

Bir anlamda, iki soru bindirildiğini var. İlk olduğunda dinamik ayırma (new) kullanmalıyız? İkinci işaretçiler kullanmalıyız?

Önemli olan mesaj gerektiğidir-eve götürher zaman bu iş için uygun aracı kullanmak. Hemen hemen tüm durumlarda, bir şey daha uygun ve dinamik ayırma ve/veya manuel sahne ham işaretçi kullanarak daha güvenli.

Dinamik ayırma

Soru bir nesne oluşturmak için iki yol gösterdin. Asıl fark nesne depolama süresidir. Bir blok içinde Object myObject; yaparken, nesne kapsam dışına çıktığında otomatik olarak yok olacak anlamına gelen otomatik depolama süresi ile oluşturulur. Açıkça 3* *o kadar hayatta kalır anlamına gelir new Object() nesne dinamik depolama süresi ne zaman. Sadece ihtiyacınız olduğunda dinamik depolama süresi kullanmalısınız. Yanigerekirher zamanne zaman otomatik depolama süresi ile nesneleri oluştururken tercih ederim.

Dinamik ayırma: gerektirebilir başlıca iki durum

  1. Nesnenin geçerli kapsamı daha uzun yaşamak gerekir- belirli bir bellek konumu, bir kopyasını değil, belirli bir nesne. Eğer kopyalama/nesne (gerekir çoğu zaman, hareket halindeki bir sorun yoksa, otomatik bir nesne tercih etmelisiniz.
  2. Çok fazla bellek ayrılamadı gerekirkolayca yığın doldurmak olabilir., O-cekti var olmak güzel eğer biz gerek yoktu endişe kendimizi bu (çoğu zaman gerek yoktu, gerçekten dışarıda, amaç C , ama ne yazık ki biz uğraşmak zorunda gerçeklik sistemleri ediyoruz geliştirmek için.

Dinamik ayırma gerek kesinlikle, akıllı bir işaretçi veya RAII gerçekleştiren başka bir türü (standart kaplar gibi) saklanması gerekir. Akıllı işaretçiler dinamik olarak ayrılan mülkiyeti semantiği sağlar. Örneğin std::unique_ptr std::shared_ptr, bir göz atın. Eğer onları uygun şekilde kullanırsanız, tamamen kendi bellek yönetimi (Rule of Zero) gerçekleştirme önleyebilirsiniz neredeyse.

İşaretçiler

Ancak, dinamik ayırma ötesinde ham işaretçileri için daha genel başka kullanım alanları da var, ama en çok tercih etmelisiniz alternatifleri var. Daha önce olduğu gibigerçekten işaretçiler gerekli olmadıkça, her zaman alternatifler tercih ederim.

  1. Başvuru semantik gerekir. Bazen geçmek istiyorum bir nesne kullanarak bir işaretçi (ne olursa olsun nasıl oldu ayrılmış) çünkü istediğiniz işlevi olan önünden geçiyorsun için erişim belirli bir nesne (bir kopya). Ancak, çoğu durumda, bunun için tasarlanmış özel bir şey olduğu için işaretçiler için başvuru türleri tercih etmelisiniz. Bu mutlaka durum 1'de geçerli kapsamı dışındadır, nesne olarak yaşam süresinin uzatılması hakkında değildir. Eğer nesnenin bir kopyasını geçen sen iyiysen daha önce olduğu gibi, başvuru semantik gerek yok.

  2. Polimorfizmi gerekir. Sadece fonksiyonlar polymorphically (yani, bir nesnenin dinamik Türüne göre) nesnesi için işaretçi veya başvuru yoluyla arayabilirsiniz. Eğer ihtiyacın olan davranışları varsa, işaretçileri veya başvuruları kullanmak gerekir. Yine başvurular tercih edilmelidir.

  3. Bir nesnenin isteğe bağlı olduğunu göstermek istiyorumnullptr bir nesne ihmal ediliyor zaman geçti izin vererek. Eğer bir tartışma varsa, varsayılan bağımsız değişken veya işlev aşırı kullanmayı tercih etmelisiniz. Aksi takdirde, davranış, boost::optional gibi (ya da belki de çok yakında ... std::optional - . Bu kapsüller bir tür kullanımı tercih edilmelidir ^strong>Editstd::optional mevcut C 14 taslak) n3797 dışında oy kullandı.

  4. Derleme birimleri ayrıştır için derleme zamanı artırmak istiyorum. Bir işaretçi yararlı özelliği sadece sivri bir tip ileri bir beyan (aslında nesne kullanmak için bir tanım gerekir) gerektirir. Bu önemli ölçüde derleme zamanı artırabilir eğer derleme işlemi, parçaları ayrıştır sağlar. Pimpl idiom bkz.

  5. C kütüphanesi ile arayüz gerekirya da C tarzı bir kütüphane. Bu noktada, ham işaretçileri kullanmak zorunda kalıyorsunuz. Yapabileceğiniz en iyi şey, sadece ham işaretçiler son anda gevşek bırakın emin olun. ** 10 üye fonksiyonunu kullanarak örneğin akıllı bir işaretçi ham bir işaretçi alır. Eğer bir kütüphane, bir kolu ile ayırması için bekliyor sizin için bazı ayırma gerçekleştirir, sık sık Yukarı nesneyi uygun şekilde ayırması özel bir deleter ile akıllı bir işaretçi başa sarabilirsiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010
  • Noam Erez

    Noam Erez

    3 NİSAN 2012
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007