Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mempengaruhi Penyata Pulangan?
Memahami rujukan nilai dan gerakkan semantik
Dalam C 11, nilai rujukan dan semantik bergerak diperkenalkan untuk meningkatkan prestasi dan kecekapan apabila bekerja dengan nilai sementara. Rujukan rnilai (&&) merujuk kepada objek sementara, manakala semantik alih membolehkan kita mengalihkan kandungan satu objek ke objek lain tanpa menyalin.
Contoh 1
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 objek std::vector sementara, yang ditangkap oleh rujukan rvalue rval_ref. Memandangkan objek sementara dialihkan ke dalam rval_ref, ia menghalang salinan dengan berkesan.
Contoh 2
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();
Dalam kes ini, fungsi return_vector mengembalikan std sementara: :vector object mengikut nilai dan menggunakan fungsi std::move untuk secara eksplisit mengalihkan kandungan objek sementara ke dalam objek yang dikembalikan. Ini mewujudkan ralat masa jalan kerana rval_ref kini memegang rujukan kepada objek sementara yang musnah.
Contoh 3
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 serupa dengan Contoh 1, di mana fungsi return_vector mengembalikan objek std::vector sementara mengikut nilai dan menggunakan std::move untuk mengalihkan kandungan. Walau bagaimanapun, dalam kes ini, std::move adalah tidak diperlukan dan boleh menghalang prestasi dengan menghalang pengoptimuman nilai pulangan.
Amalan terbaik
Pendekatan terbaik ialah menggunakan Contoh 4, di mana objek sementara dialihkan secara tersirat ke dalam objek yang dikembalikan tanpa menggunakan std::move secara eksplisit. Pengkompil akan melakukan pengoptimuman nilai pulangan (RVO) untuk mengelakkan penyalinan yang tidak perlu.
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
Atas ialah kandungan terperinci Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mempengaruhi Penyata Pulangan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!