Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mengoptimumkan Nilai Pulangan Vektor?

Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mengoptimumkan Nilai Pulangan Vektor?

Barbara Streisand
Lepaskan: 2024-12-23 17:51:13
asal
921 orang telah melayarinya

How Can C  11 Rvalue References and Move Semantics Optimize Vector Return Values?

Rujukan Nilai C 11 dan Semantik Bergerak: Membongkar Nilai Pulangan

Dalam bidang C 11, memahami rujukan nilai dan menggerakkan semantik adalah penting . Artikel ini bertujuan untuk menjelaskan perbezaan antara tiga contoh kod dan menentukan yang mengelakkan pertindihan vektor.

Contoh Pertama

std::vector<int> return_vector(void) {
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();
Salin selepas log masuk

Di sini, fungsi mengembalikan pembolehubah setempat, tmp, mengikut nilai. Rujukan rval_ref mengikat salinan tmp. Ini serupa dengan:

const std::vector<int> &rval_ref = return_vector();
Salin selepas log masuk

kecuali rval_ref tidak boleh digunakan untuk operasi bukan const.

Contoh Kedua

std::vector<int> &&return_vector(void) {
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();
Salin selepas log masuk

Ini contoh salah cuba untuk mengembalikan pembolehubah tempatan yang dialihkan, tmp. Memandangkan tmp dimusnahkan apabila fungsi keluar, rval_ref memegang rujukan berjuntai. Ini berkemungkinan menyebabkan ralat masa jalan.

Contoh Ketiga

std::vector<int> return_vector(void) {
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();
Salin selepas log masuk

Contoh ini serupa dengan yang pertama, di mana tmp dikembalikan mengikut nilai. Panggilan std::move adalah berlebihan dan boleh merendahkan prestasi dengan melumpuhkan pengoptimuman nilai pulangan (RVO).

Amalan Terbaik

Untuk prestasi optimum, gunakan pendekatan berikut:

std::vector<int> return_vector(void) {
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> rval_ref = return_vector();
Salin selepas log masuk

Pembolehubah tempatan tmp secara tersirat dianggap sebagai nilai r dalam penyata pulangan. Pengkompil akan menggunakan RVO, mengelakkan salinan atau pergerakan, atau ia akan menggunakan pembina bergerak jika perlu.

Atas ialah kandungan terperinci Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mengoptimumkan Nilai Pulangan Vektor?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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