Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah \"Mahukan Kelajuan? Lulus Mengikut Nilai\" Sentiasa Benar: Bilakah Lulus Melalui Rujukan Mencapai Prestasi Lulus Mengikut Nilai?

Adakah \"Mahukan Kelajuan? Lulus Mengikut Nilai\" Sentiasa Benar: Bilakah Lulus Melalui Rujukan Mencapai Prestasi Lulus Mengikut Nilai?

Barbara Streisand
Barbara Streisandasal
2024-10-26 17:09:03715semak imbas

Is

"Mahukan Kelajuan? Lulus Nilai" dan Pengoptimuman Prestasi

Apabila berurusan dengan operasi berat salinan, pembangun sering berusaha untuk mengoptimumkan prestasi. Premis ini telah membawa kepada aksiom "Mahukan kelajuan? Pass by value" yang dicipta oleh Scott Meyers. Walau bagaimanapun, tanggapan ini menimbulkan persoalan: adakah lulus mengikut nilai sentiasa memberikan kelebihan prestasi berbanding lulus melalui rujukan?

Memandangkan kelas X dan Y berikut:

<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 X, pembina mengambil salinan hujah dan menggunakan pembangun bergerak untuk memulakan pembolehubah ahlinya mem_name. Dalam Y, pembina mengambil rujukan const dan memulakan mem_name terus daripada hujah.

Sekarang, mari kita periksa senario di mana kita menggunakan kelas ini:

<code class="cpp">std::string foo() { return "a" + std::string("b"); }

int main() {
    X(foo());
    Y(foo());
}</code>

Fungsi foo() mengembalikan a nilai sementara yang digunakan untuk memulakan nama dalam X dan mem_name dalam Y.

Dalam kes X, pengkompil boleh mengoptimumkan pembinaan foo() dan meletakkan nilai pulangannya terus ke dalam nama. Selepas itu, ia memindahkan nama ke mem_name. Proses ini menghasilkan satu pergerakan, tanpa sebarang salinan.

Sebaliknya, Y tidak boleh melakukan pengoptimuman ini. Ia mengikat nilai pulangan sementara foo() kepada nama rujukannya dan kemudian menyalin nilai itu ke mem_name. Oleh itu, Y melakukan salinan.

Ringkasnya, apabila menghantar nilai r (objek sementara), lulus mengikut nilai dalam X mempunyai potensi untuk mengoptimumkan proses kepada satu pergerakan, manakala lulus melalui rujukan dalam Y memerlukan salinan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pengoptimuman ini bergantung pada keupayaan pengkompil dan pemprofilan sentiasa dinasihatkan untuk menentukan kesan prestasi sebenar.

Atas ialah kandungan terperinci Adakah \"Mahukan Kelajuan? Lulus Mengikut Nilai\" Sentiasa Benar: Bilakah Lulus Melalui Rujukan Mencapai Prestasi Lulus Mengikut Nilai?. 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