Taşı (hareket yapıcısı gibi) işlemleri için std::shared_ptr
olan ucuz temelde gibi, "çalarak işaretçiler" (kaynaktan bir hedefe, daha kesin konuşmak gerekirse, bütün durumu kontrol bloğu başvuru sayısı bilgileri de dahil olmak üzere, hedef kaynaktan "çalıntı" olduğu) .
Bunun yerine , atomik referans sayısı artışını çağırma üzerindeki kopyalama işlemleri (yani, yalnızca bir tamsayı veri üyesinde değil, örneğin Windows'da arama ), bu sadece işaretçileri / durumu çalmaktan daha pahalıdır .std::shared_ptr
++RefCount
RefCount
InterlockedIncrement
Bu nedenle, bu vakanın ref sayısı dinamiklerini ayrıntılı olarak analiz etmek:
compilerInstance.setInvocation(sp);
Eğer başarılı olursa sp
değeri tarafından ve daha sonra bir almak kopyasını içine CompilerInstance::setInvocation
yöntemle, sahip:
- Yöntemi girerken,
shared_ptr
parametre kopyalanarak oluşturulur: ref count atomik artış .
- Yöntemin vücudun İçinde, kopya
shared_ptr
veri elemanı içerisine parametresini: saymak Ref atom artışı .
- Yöntemden çıkıldığında,
shared_ptr
parametre yok edilir: ref count atomik azalma .
Toplam üç atomik işlem için iki atomik artımınız ve bir atomik azalmanız var .
Bunun yerine, shared_ptr
parametreyi değere göre geçirirseniz ve daha sonra std::move
yöntemin içinde (Clang kodunda doğru şekilde yapıldığı gibi), şunları elde edersiniz:
- Yöntemi girerken,
shared_ptr
parametre kopyalanarak oluşturulur: ref count atomik artış .
- Yöntemin vücudun İçinde, veri elemanı içerisine parametre: ref sayısı yok değil değiştirin! Sadece işaretçileri / durumu çalıyorsunuz: pahalı atomik referans sayma işlemleri dahil değildir.
std::move
shared_ptr
- Yöntemden çıkılırken
shared_ptr
parametre yok edilir; ancak 2. adımda hareket ettiğinizden beri, shared_ptr
parametre artık hiçbir şeye işaret etmediği için yok edilecek bir şey yok. Yine, bu durumda atomik azalma olmaz.
Alt satır: bu durumda sadece bir referans sayısı atomik artış, yani sadece bir atomik işlem elde edersiniz .
Gördüğünüz gibi, bu, kopya durumu için iki atomik artış artı bir atomik azalmadan (toplam üç atomik işlem için) çok daha iyidir .