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
813 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!

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