Rumah >pembangunan bahagian belakang >C++ >Patutkah Pass-by-Value Menjadi Lalai untuk Jenis Nilai dalam C 11?
Pass-by-Value dalam C 11: Satu Penilaian Semula
Dalam C 11, pengenalan rujukan rnilai dan pembina bergerak telah mencetuskan perbahasan: patut lulus demi nilai menjadi lalai untuk nilai jenis?
Asal-usul Rujukan Laluan
Secara sejarah, menghantar objek besar mengikut nilai dalam C adalah tidak cekap kerana penyalinan yang tidak perlu. Parameter rujukan lebih disukai untuk mengelakkan pertindihan yang mahal. Walau bagaimanapun, rujukan memperkenalkan kerumitan dalam pemilikan dan pengurusan ingatan, terutamanya untuk objek yang diperuntukkan timbunan.
Paradigma Baharu dalam C 11
Dengan rujukan rnilai dan pembina bergerak, ia kini boleh dilaksanakan untuk melaksanakan jenis nilai seperti std::vector dan std::string yang murah untuk lulus mengikut nilai. Ini menimbulkan persoalan: adakah nilai lulus-demi-nilai menjadi standard baharu untuk jenis ini?
Pengesyoran
Menurut Dave Abrahams, nilai lulus disyorkan jika salinan diperlukan dalam fungsi. Ini membenarkan pengkompil untuk mengoptimumkan salinan, seperti yang dilihat dalam contoh berikut:
void foo(T t) { // ... }
Ini boleh digunakan secara fleksibel untuk menghantar lvalues, prvalues atau xvalues:
T lval; foo(lval); // copy from lvalue foo(T {}); // (potential) move from prvalue foo(std::move(lval)); // (potential) move from xvalue
Pengecualian
Rujukan lalu kepada const kekal sebagai pilihan yang munasabah untuk tertentu senario di mana salinan tidak diperlukan atau tidak diingini. Dalam kes sedemikian, sintaks berikut boleh digunakan:
class T { U u; V v; public: T(U u, V v) : u(std::move(u)) , v(std::move(v)) {} };
Kesimpulan
Dalam C 11, pass-by-value ialah pilihan yang menarik untuk jenis nilai yang memerlukan penyalinan dalam fungsi. Ia memudahkan pengendalian parameter dan membolehkan operasi pergerakan yang cekap. Walau bagaimanapun, rujukan terus kepada const kekal sebagai alternatif yang sesuai dalam kes di mana salinan tidak diperlukan.
Atas ialah kandungan terperinci Patutkah Pass-by-Value Menjadi Lalai untuk Jenis Nilai dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!