Rumah >pembangunan bahagian belakang >C++ >Adakah Kita Masih Melepasi Rujukan `std::string` dengan `const std::string&`?
Obsolescence of Passing const std::string& Rujukan: Perspektif Herb Sutter
Dalam ceramah baru-baru ini, Herb Sutter menyatakan perkaitan yang semakin berkurangan lulus std::vector dan std::rentetan oleh const&. Beliau mencadangkan pendekatan tradisional:
std::string do_something(const std::string& inval)
kini kurang diingini berbanding:
std::string do_something(std::string inval)
Walaupun diakui bahawa inval mengekalkan saiznya, hujah Herb berpunca daripada senario yang melibatkan rantaian fungsi. Pertimbangkan contoh di mana A memanggil B, yang seterusnya memanggil C:
Kes 1: Melewati const Rujukan
void B(const std::string& str) { C(str); } void C(const std::string& str) { /* Use str but do not store it */ }
Apabila C memerlukan penyimpanan, operasi salinan menjadi perlu:
void C(const std::string& str) { m_str = str; }
Walau bagaimanapun, penggunaan const& menghalang C daripada mengakses asas data dipindahkan ke parameternya.
Kes 2: Melepasi Nilai
void B(std::string str) { C(std::move(str)); } void C(std::string str) { m_str = std::move(str); }
Dalam senario ini, rentetan dialihkan melalui panggilan fungsi, mengelakkan salinan yang tidak diperlukan. Overhed prestasi untuk beralih ke nilai diimbangi oleh faedah mengelakkan peruntukan memori untuk rentetan kecil dengan Pengoptimuman Rentetan Pendek (SSO).
Akhirnya, pilihan antara lulus melalui rujukan const atau nilai bergantung pada penggunaan khusus kes dan keutamaan pembangun untuk kecekapan peruntukan memori berbanding kelemahan prestasi yang berpotensi.
Atas ialah kandungan terperinci Adakah Kita Masih Melepasi Rujukan `std::string` dengan `const std::string&`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!