Thread overview
C++'da Akıllı İşaretçiler Varken İşaretçileri Kullanmak
May 24, 2016
İbrahim
May 24, 2016
İbrahim
May 24, 2016

Selamün Aleyküm;

Benim gördüğüm kadarıyla yazılımların kaynak kodlarında neredeyse tüm kodlarda işaretçi kullanılmış. Merak ettiğim ise neden C++'da akıllı işaretçiler varken normal işaretçiler çok daha fazla kullanılıyor? Ali Hocam daha önceki bir sualimde bana akıllı işaretçiler kullanmamın bana hız kaybı yaşatmayacağını söylemişti. Bunun sebebi nedir? Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 24, 2016

Alıntı:

>

Daha önce söylediğimin aksine, akıllı işaretçiler normal işaretçilerden daha masraflıdır.

Daha masraflı nasıl olabiliyor? Cevabınız için teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 24, 2016

Genel kurallar şöyle:

  • Nesnenin sahibiysek akıllı işaretçi kullanırız

  • Nesnenin sahibi değilsek, örneğin bir işlevsek ve bize kullanmamız için nesne gösteriliyorsa normal işaretçi kullanırız

Benim bildiğim kadarıyla, modern C++'ta akıllı işaretçiler çok daha fazla kullanılıyor. Normal işaretçi kullanan kodların bazıları RAII yönteminden haberdar olmadıklarından öyle yapıyorlardır.

Daha önce söylediğimin aksine, akıllı işaretçiler normal işaretçilerden daha masraflıdır.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 24, 2016

shared_ptr'dan bahsettiğimizi varsayıyorum.

Öncelikle, aynı nesneyi gösteren kaç adet akıllı işaretçi kopyası bulunduğunu sayan bir sayaca ihtiyaç var. Bu sayaç doğal olarak bir yer tutuyor. Bunun ötesinde, normalde sayaç bile dinamik olarak ayrılıyor. Dolayısıyla, shared_ptr aslında şöyle iki üyeden oluşur:

// (Sözde kod)
template <typename T>
struct shared_ptr {
   size_t * sayaç;
   T * nesne;
};

Sayaçla ilgili olan shared_ptr işlemleri sırasında nesneden farklı olan o adrese de erişilmesi gerekir. Bu da işlemci ara belleklerine (CPU cache) biraz daha fazla yük getirir. Örneğin, nesnenin bulunduğu bölge ara bellekte olsa bile sayacın bulunduğu bölge ara bellek dışında olabilir. Bu yüzden onun yüklenmesi zaman alacaktır.

Not: make_shared() kullanılırsa sayaç dinamik bellekten ayrılmaz.

Özet:

  • Sayaç hem bellek kullanımı açısından hem de o bölgelere erişim açısından masraf getirir

  • make_shared() kullanılmışsa erişim masrafı büyük ölçüde giderilmiş olur

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]