Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Rujukan Nilai R dan Memindahkan Kesan Semantik C 11 Mengembalikan Penyata?

Bagaimanakah Rujukan Nilai R dan Memindahkan Kesan Semantik C 11 Mengembalikan Penyata?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-21 15:11:10567semak imbas

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

Rujukan Rnilai dan Pindahkan Semantik dalam C 11 dengan Penyata Pulangan

C 11 memperkenalkan rujukan nilai dan menggerakkan semantik untuk meningkatkan prestasi dengan mengelakkan salinan yang tidak diperlukan dan mengoptimumkan penciptaan objek. Memahami perbezaan antara teknik ini adalah penting untuk menulis kod yang cekap.

Analisis Contoh

Pertimbangkan contoh kod C 11 berikut:

Contoh Pertama:

std::vector<int> return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();

Kedua Contoh:

std::vector<int>&& return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Contoh Ketiga:

std::vector<int> return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Penjelasan

Contoh Pertama:

  • Jenis pemulangan ialah rujukan nilai std::vector&.
  • tmp ialah pembolehubah setempat dan oleh itu nilai r sementara.
  • Tmp sementara dikembalikan melalui salinan, jadi tiada semantik pergerakan yang terlibat.
  • rval_ref menjadi rujukan bukan nilai tetap kepada yang dikembalikan vektor.

Contoh Kedua:

  • Jenis pulangan ialah rujukan rnilai std::vector&&.
  • tmp masih sementara rvalue.
  • std::move(tmp) memaksa fungsi untuk mengembalikan nilai r sementara melalui pergerakan, bukannya salinan.
  • Ini bermakna tmp dipindahkan ke nilai pulangan dan rval_ref sekarang memegang rujukan rnilai yang sah.

Ketiga Contoh:

  • Contoh ini serupa dengan yang pertama.
  • Jenis pulangan ialah rujukan lvalue std::vector&, walaupun std:: move(tmp).
  • std::move(tmp) adalah tidak perlu dan tiada tujuan dalam hal ini konteks.
  • Tmp sementara dikembalikan melalui salinan dan rval_ref menjadi rujukan bukan nilai tetap kepada vektor yang dikembalikan.

Amalan Terbaik

Cara yang disyorkan untuk mengembalikan objek sementara sebagai rujukan nilai bergerak sahaja (cth., std::vector&&) adalah dengan hanya meninggalkan rujukan dan membiarkan pengkompil memutuskan sama ada untuk memindahkan atau menyalin objek berdasarkan pengoptimuman nilai pulangan (RVO).

std::vector<int> return_vector() {
    std::vector<int> tmp {1, 2, 3, 4, 5};
    return tmp;
}

std::vector<int> rval_ref = return_vector();

Pendekatan ini memberikan yang terbaik gabungan prestasi dan ketepatan.

Atas ialah kandungan terperinci Bagaimanakah Rujukan Nilai R dan Memindahkan Kesan Semantik C 11 Mengembalikan Penyata?. 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