Rumah > pembangunan bahagian belakang > C++ > Adakah Melepasi `std::string` oleh `const std::string&` Masih Bermanfaat dalam C Moden?

Adakah Melepasi `std::string` oleh `const std::string&` Masih Bermanfaat dalam C Moden?

Susan Sarandon
Lepaskan: 2024-12-22 05:38:14
asal
693 orang telah melayarinya

Is Passing `std::string` by `const std::string&` Still Beneficial in Modern C  ?

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;
}
Salin selepas log masuk

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.
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan