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

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

DDD
DDDasal
2024-12-12 14:27:141009semak imbas

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.
}

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!

Kenyataan:
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