Nilai C 11 dan gerakkan semantik dengan pernyataan pulangan
Dalam C 11, rujukan nilai dan semantik bergerak menawarkan faedah prestasi yang ketara dengan mengoptimumkan pengurusan memori dan pemilikan objek. Ini amat relevan apabila mengembalikan objek mengikut nilai daripada fungsi.
Memahami Rujukan Rvalue dan Move Semantics
Rujukan rvalue (&&) ialah jenis yang mengikat kepada sementara objek atau objek yang akan dimusnahkan. Apabila objek sementara dikembalikan daripada fungsi menggunakan rujukan nilai, pengkompil boleh mengoptimumkan pulangan dengan menggunakan semantik alih dan bukannya semantik salin.
Semantik pindah melibatkan pemindahan pemilikan sumber objek daripada objek sementara ke pembolehubah sasaran tanpa membuat salinan baharu objek. Ini boleh meningkatkan prestasi dengan ketara, terutamanya untuk objek besar.
Contoh Analisis
Mari kita periksa tiga contoh yang anda berikan:
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, objek sementara tmp dikembalikan oleh nilai. Oleh kerana rval_ref ialah rujukan rvalue, ia mengikat objek sementara dan memanjangkan hayatnya melebihi panggilan fungsi. Tingkah laku ini serupa dengan mengembalikan rujukan const kepada objek sementara.
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 cuba mengembalikan objek sementara tmp mengikut nilai menggunakan menggerakkan semantik. Walau bagaimanapun, ia mengakibatkan ralat masa jalan kerana rval_ref memegang rujukan kepada objek tmp yang dimusnahkan.
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();
Contoh ini bersamaan dengan yang pertama contoh. Operasi bergerak pada tmp adalah tidak perlu dan boleh menghalang prestasi dengan menghalang pengoptimuman nilai pulangan (RVO).
Amalan Terbaik
Amalan yang disyorkan untuk mengembalikan objek mengikut nilai ialah dengan hanya kembalikan objek tanpa menggunakan semantik bergerak secara eksplisit. Dalam kes ini, pengkompil akan mengoptimumkan pulangan secara automatik menggunakan RVO atau gerakkan semantik, yang mana lebih cekap.
std::vector<int> return_vector(void) { return {1,2,3,4,5}; } std::vector<int> rval_ref = return_vector();
Coretan kod ini mengembalikan objek sementara secara langsung, membenarkan pengkompil menentukan strategi pengoptimuman optimum .
Atas ialah kandungan terperinci Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mengoptimumkan Objek Kembali mengikut Nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!