Rumah > pembangunan bahagian belakang > C++ > Adakah Kita Masih Melepasi std::string by const &?

Adakah Kita Masih Melepasi std::string by const &?

DDD
Lepaskan: 2024-12-12 14:27:14
asal
949 orang telah melayarinya

Should We Still Pass std::string by const &?

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan