Langkah operasi (seperti langkah konstruktor) untuk std::shared_ptr
yang 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_ptr
panggilan peningkatan referensi nomor atom (yaitu tidak hanya ++RefCount
pada anggota RefCount
data integer , tetapi misalnya memanggil InterlockedIncrement
pada 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 sp
nilai dan kemudian mengambil salinan di dalam CompilerInstance::setInvocation
metode, Anda memiliki:
- Saat memasukkan metode,
shared_ptr
parameter dibuat salinan: ref count atomic increment .
- Di dalam tubuh metode ini, Anda menyalin yang
shared_ptr
parameter ke dalam data anggota: REF menghitung atom kenaikan .
- Saat keluar dari metode,
shared_ptr
parameter dirusak: ref count atomic decrement .
Anda memiliki dua peningkatan atom dan satu penurunan atom, dengan total tiga operasi atom .
Sebaliknya, jika Anda melewatkan shared_ptr
parameter dengan nilai dan kemudian std::move
di dalam metode (seperti yang dilakukan dengan benar dalam kode Dentang), Anda memiliki:
- Saat memasukkan metode,
shared_ptr
parameter dibuat salinan: ref count atomic increment .
- Di dalam tubuh metode ini, Anda
std::move
yang shared_ptr
parameter 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_ptr
parameter dirusak; tetapi karena Anda pindah di langkah 2, tidak ada yang dirusak, karena shared_ptr
parameternya 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.