Pengenalan:
Dalam C , berfungsi dengan petunjuk dikongsi adalah penting untuk pengurusan ingatan yang betul. Dua pendekatan biasa untuk mencipta penunjuk kongsi menggunakan std::make_shared dan pembina shared_ptr tradisional. Memahami perbezaan antara kaedah ini adalah penting untuk mengoptimumkan kecekapan kod. Artikel ini meneroka sebab std::make_shared lebih cekap daripada menggunakan shared_ptr secara langsung.
Perbandingan Peruntukan Timbunan:
Perbezaan utama terletak pada peruntukan timbunan. Std::make_shared melaksanakan satu peruntukan timbunan, memperuntukkan memori untuk kedua-dua blok kawalan (metadata) dan objek terurus. Sebaliknya, menggunakan pembina shared_ptr memerlukan dua peruntukan timbunan: satu untuk objek terurus dan satu untuk blok kawalan.
Pengendalian Luar Biasa:
Satu lagi kelebihan std: :make_shared ialah pengendalian pengecualian yang lebih baik. Jika pengecualian berlaku semasa pembinaan objek terurus menggunakan baharu, memori yang diperuntukkan untuk objek mungkin hilang. Ini kerana penuding mentah tidak segera dihantar kepada pembina shared_ptr, yang membawa kepada potensi kebocoran memori. Menggunakan std::make_shared menghapuskan isu ini kerana ia mewujudkan kedua-dua blok kawalan dan objek dalam satu operasi, memastikan pengurusan memori yang betul walaupun dalam kes pengecualian.
Potensi Kelemahan:
Walaupun kecekapannya, std::make_shared mempunyai potensi kelemahan. Memandangkan ia mencipta satu peruntukan timbunan untuk kedua-dua blok kawalan dan objek terurus, memori untuk kedua-duanya tidak boleh diagihkan secara bebas. Jika penunjuk lemah wujud yang merujuk kepada objek terurus, blok kawalan akan kekal hidup, walaupun selepas penunjuk yang dikongsi telah dipadamkan. Ini boleh membawa kepada penggunaan memori yang berpanjangan berbanding menggunakan peruntukan timbunan berasingan untuk blok kawalan dan objek terurus.
Kesimpulan:
Std::make_shared menawarkan yang lebih cekap dan pendekatan pengecualian-selamat untuk mencipta petunjuk dikongsi dengan melaksanakan satu peruntukan timbunan. Ini memudahkan pengurusan memori dan menghapuskan potensi kebocoran memori. Walaupun std::make_shared mungkin mempunyai sedikit kelemahan dalam senario di mana deallokasi bebas diingini, kecekapan keseluruhan dan pengendalian pengecualian menjadikannya pilihan pilihan untuk kebanyakan aplikasi C.
Atas ialah kandungan terperinci Mengapakah `std::make_shared` Lebih Cekap Daripada Pembina `shared_ptr` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!