Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Melepasi Nilai atau Rujukan: Bilakah \"Mahukan Kelajuan? Lulus Nilai\" Sebenarnya Benar?

Melepasi Nilai atau Rujukan: Bilakah \"Mahukan Kelajuan? Lulus Nilai\" Sebenarnya Benar?

Susan Sarandon
Susan Sarandonasal
2024-10-27 01:34:03448semak imbas

  Passing by Value or Reference: When is

"Mahukan Kepantasan? Lulus Nilai" - Meneroka Implikasi Prestasi

Kenyataan Scott Meyers "Mahukan kelajuan? Lulus nilai" menimbulkan persoalan tentang faedah prestasi menghantar objek mengikut nilai berbanding dengan rujukan. Dalam konteks ini, lulus mengikut nilai melibatkan operasi salinan, manakala lulus melalui rujukan mengelakkan salinan yang tidak diperlukan.

Pertimbangkan contoh berikut dengan struct X dan Y:

<code class="cpp">struct X {
  std::string mem_name;
  X(std::string name) : mem_name(std::move(name)) {}
};
struct Y {
  std::string mem_name;
  Y(const std::string &name) : mem_name(name) {}
};</code>

Dalam pembina X, nama argumen disalin ke objek sementara sebelum menggunakan pembangun bergerak pada std::string untuk memulakan mem_name. Dalam pembina Y, nama hujah ialah rujukan const, tetapi salinan masih dibuat untuk memulakan mem_name. Oleh itu, X melakukan operasi "salin-kemudian-gerakkan", manakala Y melakukan satu salinan.

Menurut hujah Meyers, nampaknya menghantar nilai (seperti dalam X) mungkin lebih pantas disebabkan oleh potensi untuk pengoptimuman, seperti pengoptimuman nilai pulangan (RVO). Walau bagaimanapun, pemeriksaan lebih dekat mendedahkan bahawa keputusan bergantung pada jenis hujah yang diluluskan (lvalue atau rvalue):

  • Lvalues: Kedua-dua X dan Y akan melakukan salinan (dalam X apabila memulakan nama, dalam Y apabila memulakan mem_name), diikuti dengan operasi alih dalam X.
  • Rvalues: X hanya boleh melakukan pergerakan jika RVO boleh digunakan, manakala Y masih memerlukan salinan.

Secara amnya, pergerakan adalah lebih pantas daripada melepasi penunjuk, yang pada asasnya adalah apa yang dilakukan melalui rujukan. Oleh itu, untuk nilai r, X berprestasi lebih baik daripada Y, manakala untuk nilai l, prestasi adalah serupa.

Perlu ambil perhatian bahawa ini bukan peraturan universal dan pengoptimuman mungkin berbeza-beza bergantung pada pengkompil dan platform. Pemprofilan disyorkan untuk menentukan pendekatan optimum dalam kes tertentu.

Atas ialah kandungan terperinci Melepasi Nilai atau Rujukan: Bilakah \"Mahukan Kelajuan? Lulus Nilai\" Sebenarnya Benar?. 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