Rumah > pembangunan bahagian belakang > C++ > Sekiranya Anda Lulus `std::string` dan `std::vector` dengan Rujukan Nilai atau Const?

Sekiranya Anda Lulus `std::string` dan `std::vector` dengan Rujukan Nilai atau Const?

Susan Sarandon
Lepaskan: 2024-12-29 00:22:10
asal
741 orang telah melayarinya

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

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

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

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

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!

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