Rumah >pembangunan bahagian belakang >C++ >Sekiranya Anda Lulus `std::string` dan `std::vector` dengan Rujukan Nilai atau Const?
Melalui Parameter Mengikut Nilai: Memikirkan semula const std::string &
Herb Sutter baru-baru ini mempersoalkan amalan konvensional lulus std::vector dan std:: rentetan objek dengan rujukan const. Beliau mencadangkan bahawa dalam banyak kes, menghantarnya mengikut nilai kini lebih baik, seperti yang ditunjukkan dalam kod berikut:
std::string do_something(std::string inval) { std::string return_val; // ... do stuff ... return return_val; }
Walaupun nilai pulangan ialah nilai r pada titik pemulangan fungsi dan boleh dialihkan kos- secara berkesan, rasional untuk pernyataan Sutter terletak pada kes seperti ini:
Pertimbangkan fungsi A yang menggunakan fungsi B, yang seterusnya memanggil fungsi C. A menghantar parameter rentetan ke B, yang memajukannya ke C. A tidak mempunyai pengetahuan langsung tentang C.
Jika B dan C mengambil rentetan melalui rujukan const, kod itu akan muncul seperti berikut:
void B(const std::string &str) { C(str); } void C(const std::string &str) { // Process `str` without storing it. }
Dengan pendekatan ini, lulus dan menerima petunjuk sudah memadai, mengelakkan penyalinan yang mahal atau bergerak.
Walau bagaimanapun, jika C perlu menyimpan rentetan:
void C(const std::string &str) { // Process `str`. m_str = str; }
Ini mencetuskan pembina salinan dan potensi peruntukan memori (mengabaikan Pengoptimuman Rentetan Pendek). Walaupun semantik pergerakan C 11 bertujuan untuk menghapuskan penyalinan yang tidak perlu, C mengambil rujukan const menghalangnya, walaupun A melepasi rentetan sementara.
Sebaliknya, jika str diluluskan oleh nilai melalui semua fungsi, bergantung pada semantik bergerak untuk dipindahkan pemilikan, C boleh menerima pakai atau membuang data tanpa menyebabkan operasi penyalinan. Pendekatan ini disertakan dengan overhed prestasi yang sedikit, tetapi ia menghapuskan peruntukan memori, yang mungkin berfaedah bergantung pada kes penggunaan tertentu.
Atas ialah kandungan terperinci Sekiranya Anda Lulus `std::string` dan `std::vector` dengan Rujukan Nilai atau Const?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!