Rujukan Nilai C 11 dan Semantik Bergerak: Membongkar Nilai Pulangan
Dalam bidang C 11, memahami rujukan nilai dan menggerakkan semantik adalah penting . Artikel ini bertujuan untuk menjelaskan perbezaan antara tiga contoh kod dan menentukan yang mengelakkan pertindihan vektor.
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();
Di sini, fungsi mengembalikan pembolehubah setempat, tmp, mengikut nilai. Rujukan rval_ref mengikat salinan tmp. Ini serupa dengan:
const std::vector<int> &rval_ref = return_vector();
kecuali rval_ref tidak boleh digunakan untuk operasi bukan const.
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();
Ini contoh salah cuba untuk mengembalikan pembolehubah tempatan yang dialihkan, tmp. Memandangkan tmp dimusnahkan apabila fungsi keluar, rval_ref memegang rujukan berjuntai. Ini berkemungkinan menyebabkan ralat masa jalan.
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 serupa dengan yang pertama, di mana tmp dikembalikan mengikut nilai. Panggilan std::move adalah berlebihan dan boleh merendahkan prestasi dengan melumpuhkan pengoptimuman nilai pulangan (RVO).
Amalan Terbaik
Untuk prestasi optimum, gunakan pendekatan berikut:
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
Pembolehubah tempatan tmp secara tersirat dianggap sebagai nilai r dalam penyata pulangan. Pengkompil akan menggunakan RVO, mengelakkan salinan atau pergerakan, atau ia akan menggunakan pembina bergerak jika perlu.
Atas ialah kandungan terperinci Bagaimanakah Rujukan C 11 Rvalue dan Move Semantics Mengoptimumkan Nilai Pulangan Vektor?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!