Bir işleve paylaşılan bir işaretçi iletmek istiyorum. Bana bununla yardım edebilir misin?
Elbette, sana bu konuda yardımcı olabilirim. C ++ 'da sahiplik anlamlarına dair biraz anlayışınız olduğunu varsayıyorum. Bu doğru mu?
Evet, konu ile oldukça rahatım.
İyi.
Tamam, shared_ptr
tartışmak için sadece iki neden düşünebilirim :
- İşlev, nesnenin sahipliğini paylaşmak ister;
- İşlev, özellikle
shared_ptr
s üzerinde çalışan bazı işlemler yapar .
Hangisiyle ilgileniyorsun?
Genel bir cevap arıyorum, bu yüzden aslında ikisiyle de ilgileniyorum. Yine de 2 numaralı durumda ne demek istediğini merak ediyorum.
Bu tür işlevlerin örnekleri std::static_pointer_cast
, özel karşılaştırıcılar veya yüklemleri içerir. Örneğin, bir vektörden tüm benzersiz paylaşılan_tr'yi bulmanız gerekiyorsa, böyle bir yüklemeye ihtiyacınız vardır.
Ah, işlevin aslında akıllı işaretçinin kendisini değiştirmesi gerektiğinde.
Kesinlikle.
Bu durumda referansla geçmemiz gerektiğini düşünüyorum.
Evet. İşaretçiyi değiştirmezse, const referansıyla geçmek istersiniz. Sahipliği paylaşmanız gerekmediği için kopyalamanıza gerek yoktur. Bu diğer senaryo.
Tamam anladım. Diğer senaryo hakkında konuşalım.
Sahipliği paylaştığınız kişi mi? Tamam. Sahipliği ile nasıl paylaşırsınız shared_ptr
?
Kopyalayarak.
O zaman fonksiyonun bir kopyasını yapması gerekecek shared_ptr
, doğru mu?
Açıkçası. Yani onu const'a referansla geçirip yerel bir değişkene kopyalayayım?
Hayır, bu bir kötümserlik. Referans ile aktarılırsa, işlevin kopyalamayı manuel olarak yapmaktan başka seçeneği kalmayacaktır. Değere göre aktarılırsa, derleyici kopya ve taşıma arasında en iyi seçimi seçecek ve bunu otomatik olarak gerçekleştirecektir. Öyleyse, değere göre aktarın.
İyi bir nokta. " Hız mı İstiyorsunuz? Değere Göre Geçiş." " Makalesini daha sık .
Bekle, ya örneğin işlev shared_ptr
bir üye değişkeninde depolarsa? Bu gereksiz bir kopya oluşturmaz mı?
Fonksiyon, shared_ptr
argümanı basitçe deposuna taşıyabilir . A'yı taşımak shared_ptr
ucuzdur çünkü herhangi bir referans sayısını değiştirmez.
Ah, iyi fikir.
Ama ben üçüncü bir senaryo düşünüyorum: Ya onu manipüle etmek shared_ptr
ya da sahipliği paylaşmak istemezseniz ?
Bu durumda, shared_ptr
işlevle tamamen alakasızdır. Pointee'ı değiştirmek istiyorsanız, bir nokta alın ve arayanların istedikleri sahiplik anlamını seçmelerine izin verin.
Puanı referans olarak mı yoksa değer olarak mı almalıyım?
Olağan kurallar geçerlidir. Akıllı işaretçiler hiçbir şeyi değiştirmez.
Kopyalayacaksam değere göre geçir, kopyalamadan kaçınmak istiyorsam referans olarak geç.
Sağ.
Hmm. Sanırım başka bir senaryoyu daha unuttun. Ya sahipliği paylaşmak istiyorsam, ancak yalnızca belirli bir koşula bağlı olarak?
Ah, ilginç bir uç durum. Bunun sık sık olmasını beklemiyorum. Ancak bu gerçekleştiğinde, ya değere göre geçebilir ve ihtiyacınız yoksa kopyayı yok sayabilir ya da referans olarak geçebilir ve ihtiyacınız varsa kopyayı oluşturabilirsiniz.
İlk seçenekte bir yedek kopya riske giriyorum ve ikincisinde potansiyel bir hamleyi kaybediyorum. Pastayı ben de yiyemez miyim?
Bunun gerçekten önemli olduğu bir durumdaysanız, biri sabit değer referansı, diğeri de r değeri referansı alan iki aşırı yükleme sağlayabilirsiniz. Biri kopyalar, diğeri hareket eder. Mükemmel yönlendirme işlevi şablonu başka bir seçenektir.
Bunun tüm olası senaryoları kapsadığını düşünüyorum. Çok teşekkür ederim.
const std::shared_ptr<myClass>& arg1