Taşı (hareket yapıcısı gibi) işlemleri için std::shared_ptrolan 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++RefCountRefCountInterlockedIncrement
Bu nedenle, bu vakanın ref sayısı dinamiklerini ayrıntılı olarak analiz etmek:
compilerInstance.setInvocation(sp);
Eğer başarılı olursa spdeğeri tarafından ve daha sonra bir almak kopyasını içine CompilerInstance::setInvocationyöntemle, sahip:
- Yöntemi girerken,
shared_ptrparametre 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_ptrparametre 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_ptrparametreyi değere göre geçirirseniz ve daha sonra std::moveyöntemin içinde (Clang kodunda doğru şekilde yapıldığı gibi), şunları elde edersiniz:
- Yöntemi girerken,
shared_ptrparametre 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::moveshared_ptr
- Yöntemden çıkılırken
shared_ptrparametre yok edilir; ancak 2. adımda hareket ettiğinizden beri, shared_ptrparametre 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 .