Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Rujukan Rvalue dan Move Semantics Meningkatkan Prestasi C 11?

Bagaimanakah Rujukan Rvalue dan Move Semantics Meningkatkan Prestasi C 11?

Susan Sarandon
Lepaskan: 2024-12-25 20:36:13
asal
252 orang telah melayarinya

How Do Rvalue References and Move Semantics Improve C  11 Performance?

Rujukan Rnilai dan Semantik Pindah dalam C 11 Terurai

Dalam C 11, rujukan rnilai dan semantik bergerak menyediakan teknik yang berkuasa untuk meningkatkan prestasi dan kecekapan . Artikel ini meneroka nuansa konsep ini melalui analisis terperinci tiga contoh:

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

Dalam contoh ini, fungsi return_vector mengembalikan sementara objek vektor mengikut nilai. Rujukan rvalue rval_ref mengikat objek sementara ini. Jangka hayat objek sementara dilanjutkan melebihi panggilan fungsi, membenarkan rval_ref untuk terus mengakses datanya. Walau bagaimanapun, sebarang pengubahsuaian yang dibuat melalui rval_ref tidak akan menjejaskan vektor asal.

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

Contoh ini cacat disebabkan oleh ralat masa jalan. Fungsi return_vector menggunakan std::move pada tmp vektor sementara sebelum mengembalikannya. Ini secara berkesan memusnahkan tmp dan meninggalkan rval_ref memegang rujukan kepada ingatan tidak sah. Akibatnya, kod ini mungkin ranap semasa pelaksanaan.

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

Sama seperti contoh pertama, contoh ini menggunakan std::move pada vektor sementara tmp sebelum mengembalikannya mengikut nilai. Walau bagaimanapun, memandangkan fungsi sudah kembali mengikut nilai, std::move adalah berlebihan dan mungkin merupakan penalti prestasi disebabkan oleh operasi memori tambahan.

Amalan Terbaik:

Cara pilihan untuk menulis kod ini adalah dengan meninggalkan std::move yang tidak perlu dan bergantung pada penukaran tersirat C 11 rnilai dalam penyata pulangan:

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

Dalam kes ini, pengkompil akan mengoptimumkan pulangan menggunakan pengoptimuman nilai pulangan (RVO) untuk menghapuskan penyalinan atau pemindahan yang tidak perlu. Sebagai alternatif, jika RVO tidak boleh dilaksanakan, pengkompil akan menggunakan pembangun bergerak bagi kelas vektor untuk melaksanakan pemindahan pemilikan yang cekap.

Atas ialah kandungan terperinci Bagaimanakah Rujukan Rvalue dan Move Semantics Meningkatkan Prestasi C 11?. 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