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
Barbara Streisandasal
2024-12-24 12:42:15607semak imbas

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

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!

Kenyataan:
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