Dalam alam pengaturcaraan, penggunaan std::move on nilai pulangan fungsi menggesa soalan apabila langkah sedemikian adalah wajar. Pertimbangkan coretan kod berikut:
struct Foo {}; Foo meh() { return std::move(Foo()); }
Dalam kes ini, langkah itu kelihatan berlebihan memandangkan Foo yang baru dibuat sudahpun menjadi xvalue kerana sifatnya yang sementara. Walau bagaimanapun, dalam senario seperti di bawah, std::move memainkan peranan penting:
struct Foo {}; Foo meh() { Foo foo; // Perform operations, ensuring safe disposal of foo return std::move(foo); }
Di sini, foo dicipta sebagai lvalue dan tanpa std::move, pengkompil mungkin tidak dapat melihat bahawa ia boleh dikeluarkan dengan selamat selepas itu. Operasi pergerakan secara eksplisit meminta objek itu dialihkan dan bukannya disalin, memastikan pengurusan sumber yang betul.
Konsep utama untuk difahami ialah "seolah-olah " peraturan yang digariskan dalam piawaian C (12.8/32). Peraturan ini memberi mandat bahawa apabila syarat khusus dipenuhi untuk menghapuskan operasi penyalinan, pengkompil mesti berkelakuan seolah-olah objek telah ditetapkan oleh nilai, walaupun ia adalah nilai. Dalam contoh yang diberikan, NRVO (Pengoptimuman Nilai Pulangan Dinamakan) membenarkan salinan dari foo kepada nilai pulangan untuk dihapuskan. Akibatnya, pembina move digunakan secara automatik tanpa std::move eksplisit.
Ringkasnya, std::move harus digunakan pada nilai pulangan apabila kriteria berikut dipenuhi:
Untuk memudahkan proses membuat keputusan dalam kod bukan templat, pertimbangkan peraturan ini:
Dengan mematuhi peraturan yang dipermudahkan ini, pembangun mengorbankan beberapa gerakkan elision tetapi mendapat kelebihan daripada kemudahan penggunaan. Walau bagaimanapun, untuk templat atau jenis yang kompleks dengan operasi pergerakan yang mahal, analisis yang teliti disyorkan untuk memastikan prestasi kod yang optimum.
Atas ialah kandungan terperinci Bilakah Anda Harus Menggunakan `std::move` pada Nilai Pulangan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!