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();
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();
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();
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();
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!