Adakah Lulus Const std::string & sebagai Parameter Menawarkan Faedah Lagi?
Dalam ceramah baru-baru ini, pakar C terkenal Herb Sutter mencadangkan bahawa hujah untuk lulus std::vector dan std::string by const & tidak lagi menarik. Untuk menggambarkan, beliau mencadangkan fungsi yang ditulis seperti berikut:
std::string do_something ( std::string inval ) { std::string return_val; // ... do stuff ... return return_val; }
Herb beralasan bahawa, memandangkan return_val akan menjadi nilai pada masa pemulangan fungsi, ia boleh dikembalikan menggunakan semantik langkah yang menjimatkan kos. Walau bagaimanapun, persoalannya tetap: mengapa lulus parameter input inval dengan rujukan? Bukankah saiz objek std::string yang lebih besar (disebabkan oleh komponen seperti penuding timbunan dan tatasusunan char) menjadikan nilai hantaran lebih berfaedah?
Rasional Herba
Cadangan Herba berpunca daripada senario di mana pelbagai fungsi bersarang terlibat. Pertimbangkan situasi di mana fungsi A memanggil fungsi B, yang seterusnya memanggil fungsi C, setiap satu menghantar parameter rentetan. Jika B dan C mengambil rentetan sebagai const &, kod itu mungkin kelihatan seperti ini:
void B(const std::string & str) { C(str); } void C(const std::string & str) { // Use `str` without storing it. }
Pendekatan ini menghantar penunjuk dengan cekap, mengelakkan penyalinan atau bergerak. C mengambil const & kerana ia tidak menyimpan rentetan.
Walau bagaimanapun, andaikan C kini perlu menyimpan rentetan itu. Mengubah suai C kepada yang berikut akan memaksa B untuk melakukan salinan ke dalam parameternya, menafikan sebarang faedah:
void C(const std::string & str) { // ... m_str = str; }
Sebaliknya, jika str diluluskan oleh nilai ke seluruh semua fungsi, bergantung pada std::move to mengendalikan pergerakan data, C hanya boleh menerima pemilikan rentetan sementara, menghapuskan keperluan untuk salinan.
Kos Pertimbangan
Walaupun nilai lulus dikenakan sedikit penalti prestasi berbanding menggunakan rujukan, ia boleh dibandingkan dengan kos penyalinan untuk rentetan kecil dengan SSO. Pilihan antara pendekatan ini bergantung pada kekerapan peruntukan memori dan kes penggunaan khusus.
Atas ialah kandungan terperinci Adakah Melepasi `std::string` oleh `const std::string&` Masih Bermanfaat dalam C Moden?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!