Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mempengaruhi Penyata Pulangan?

Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mempengaruhi Penyata Pulangan?

Barbara Streisand
Lepaskan: 2024-12-24 12:42:15
asal
605 orang telah melayarinya

How Do C  11 Rvalue References and Move Semantics Affect Return Statements?

Nilai C 11 dan gerakkan semantik dengan pernyataan pemulangan

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();
Salin selepas log masuk

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();
Salin selepas log masuk

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();
Salin selepas log masuk

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();
Salin selepas log masuk

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!

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