Rumah >pembangunan bahagian belakang >C++ >`make_shared` lwn. `shared_ptr`: Mengapa One More Cekap dan Exception-Selamat?

`make_shared` lwn. `shared_ptr`: Mengapa One More Cekap dan Exception-Selamat?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-14 12:19:11496semak imbas

`make_shared` vs. `shared_ptr`: Why is One More Efficient and Exception-Safe?

Perbezaan dalam make_shared dan Standard shared_ptr

Mengapa make_shared lebih cekap?

Untuk memahami kecekapan std::make_shared berbanding shared_ptr standard , mari kita periksa proses pembinaan mereka secara berperingkat langkah.

Menggunakan pembina shared_ptr standard:

std::shared_ptr<Object> p2(new Object("foo"));
  • Peruntukan timbunan untuk Object("foo") dilakukan.
  • Blok kawalan std::shared_ptr baharu dibuat menggunakan bahan mentah penunjuk.

Menggunakan std::make_shared:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
  • Peruntukan timbunan tunggal untuk kedua-dua blok kawalan std::shared_ptr dan contoh Objek ialah dilakukan.

Pengecualian Keselamatan

Dalam pendekatan pembina shared_ptr standard, jika pengecualian dilemparkan semasa pembinaan Objek, tiada pembersihan dilakukan, meninggalkan memori yang tergantung. Walau bagaimanapun, std::make_shared menjamin bahawa Objek yang dibina dan blok kawalan adalah sebahagian daripada satu peruntukan dan akan dibersihkan jika pengecualian dilemparkan.

Kelemahan std::make_shared

  • Peningkatan pengekalan memori berbanding menggunakan pembina shared_ptr standard: Sejak std::make_shared melakukan satu peruntukan, memori runcing tidak boleh dibebaskan sehingga blok kawalan tidak lagi digunakan. Penunjuk yang lemah kepada objek boleh memastikan blok kawalan hidup, yang berpotensi membawa kepada pengekalan memori yang dilanjutkan.

Atas ialah kandungan terperinci `make_shared` lwn. `shared_ptr`: Mengapa One More Cekap dan Exception-Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn