Forum: Diğer Konular RSS
C++'da Akıllı İşaretçiler Varken İşaretçileri Kullanmak
İbrahim #1
Üye Eki 2015 tarihinden beri · 156 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++'da Akıllı İşaretçiler Varken İşaretçileri Kullanmak
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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
İbrahim #3
Üye Eki 2015 tarihinden beri · 156 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-20, 01:13:38 (UTC -08:00)