The Old Const Std::string & Parameters
Dalam perbincangan baru-baru ini, Herb Sutter membangkitkan tanggapan bahawa amalan lazim lulus std::vector dan std::string by const & parameter mungkin tidak lagi memegang berat yang sama. Alternatif yang dicadangkannya, melepasi objek ini mengikut nilai, telah mencetuskan perdebatan dan menimbulkan persoalan.
Memahami Peralihan
Mengapa Sutter menganjurkan peralihan ini? Sebab utama terletak pada senario yang serupa dengan yang diterangkan di bawah:
Pertimbangkan fungsi A yang memanggil fungsi B, yang seterusnya memanggil fungsi C. Fungsi A menghantar rentetan melalui B dan ke C, mengekalkan ketidaksedarannya tentang Kewujudan C.
Konst & Pendekatan:
Apabila B dan C menerima rentetan sebagai const & parameter, interaksi berlaku seperti berikut:
void B(const std::string &str) { C(str); } void C(const std::string &str) { // Manipulates `str` but does not store it. }
Pendekatan ini mengedarkan penunjuk secara berkesan, mengelakkan penyalinan atau pergerakan yang tidak perlu. C menerima const & kerana ia hanya berniat untuk menggunakan rentetan, bukan menyimpannya.
Pendekatan Nilai:
Walau bagaimanapun, jika fungsi C memerlukannya untuk menyimpan rentetan , pengubahsuaian berikut dibuat:
void C(const std::string &str) { // Manipulates `str`. m_str = str; }
Seperti yang anda lihat, C tidak lagi hanya menggunakan rentetan tetapi juga menyimpan ia. Semantik langkah C 11 secara teorinya harus menghapuskan penyalinan yang tidak perlu, tetapi const & parameter C menghalangnya. Pembina salinan dan peruntukan memori yang berpotensi turut dimainkan.
Memintas Const &:
Memintas const & parameter dan menghantar rentetan mengikut nilai melalui semua fungsi menghapuskan ini isu. std::move boleh mengocok data dengan cekap jika diperlukan. Jika fungsi bercadang untuk memegang rentetan, ia boleh berbuat demikian.
Pertimbangan Prestasi:
Melalui nilai memang memerlukan perbelanjaan prestasi yang lebih tinggi berbanding menggunakan rujukan. Walau bagaimanapun, untuk rentetan kecil yang mendapat manfaat daripada SSO, kosnya boleh diabaikan.
Kesimpulan
Keputusan sama ada untuk lulus std::string mengikut const & atau nilai bergantung pada kes penggunaan khusus dan kepekaannya terhadap peruntukan memori. Walaupun lulus mengikut nilai mungkin tidak diutamakan secara universal, ia menawarkan kelebihan yang menarik dalam situasi tertentu.
Atas ialah kandungan terperinci Adakah Kita Masih Melepasi std::string by const &?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!