Langkah operasi (seperti langkah konstruktor) untuk std::shared_ptryang murah , karena mereka pada dasarnya adalah "mencuri pointer" (dari sumber ke tujuan, untuk lebih tepatnya, blok kontrol negara seluruh adalah "dicuri" dari sumber ke tujuan, termasuk informasi jumlah referensi) .
Alih-alih menyalin operasi pada std::shared_ptrpanggilan peningkatan referensi nomor atom (yaitu tidak hanya ++RefCountpada anggota RefCountdata integer , tetapi misalnya memanggil InterlockedIncrementpada Windows), yang lebih mahal daripada hanya mencuri pointer / negara.
Jadi, analisis dinamika hitungan ref dalam kasus ini secara terperinci:
// shared_ptr<CompilerInvocation> sp;
compilerInstance.setInvocation(sp);
Jika Anda melewati spnilai dan kemudian mengambil salinan di dalam CompilerInstance::setInvocationmetode, Anda memiliki:
- Saat memasukkan metode,
shared_ptrparameter dibuat salinan: ref count atomic increment .
- Di dalam tubuh metode ini, Anda menyalin yang
shared_ptrparameter ke dalam data anggota: REF menghitung atom kenaikan .
- Saat keluar dari metode,
shared_ptrparameter dirusak: ref count atomic decrement .
Anda memiliki dua peningkatan atom dan satu penurunan atom, dengan total tiga operasi atom .
Sebaliknya, jika Anda melewatkan shared_ptrparameter dengan nilai dan kemudian std::movedi dalam metode (seperti yang dilakukan dengan benar dalam kode Dentang), Anda memiliki:
- Saat memasukkan metode,
shared_ptrparameter dibuat salinan: ref count atomic increment .
- Di dalam tubuh metode ini, Anda
std::moveyang shared_ptrparameter ke dalam data anggota: count ref tidak tidak berubah! Anda hanya mencuri pointer / negara: tidak ada operasi penghitungan atom mahal.
- Saat keluar dari metode,
shared_ptrparameter dirusak; tetapi karena Anda pindah di langkah 2, tidak ada yang dirusak, karena shared_ptrparameternya tidak menunjuk ke apa pun lagi. Sekali lagi, tidak ada penurunan atom yang terjadi dalam kasus ini.
Intinya: dalam hal ini Anda hanya mendapatkan satu kenaikan atom hitungan ref, yaitu hanya satu operasi atom .
Seperti yang Anda lihat, ini jauh lebih baik daripada dua peningkatan atom ditambah satu penurunan atom (total tiga operasi atom) untuk kasing.