Masalah:
Petunjuk unik (std::unique_ptr) dalam C dengan tegas mematuhi semantik bergerak, tidak membenarkan pembinaan salinan. Walau bagaimanapun, adalah mungkin untuk mengembalikan penunjuk unik mengikut nilai daripada fungsi dan menetapkan nilai yang dikembalikan tanpa menggunakan pembina salinan. Tindakan ini menimbulkan persoalan tentang bagaimana tingkah laku yang kelihatan paradoks ini dibenarkan.
Soalan:
Adakah terdapat klausa khusus dalam spesifikasi bahasa yang membenarkan pengecualian ini?
Jawapan:
Ya. Seperti yang dinyatakan dalam §34 dan §35 C 11, pengkompil diberi kuasa untuk melakukan "penyingkiran salinan" dalam senario tertentu. Berikut ialah petikan yang berkaitan:
When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object [...]. This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type [...].
Pada dasarnya, ini bermakna jika nilai pulangan ialah objek automatik yang tidak meruap yang sepadan dengan jenis pemulangan, pengkompil boleh melangkau pembinaan salinan/gerakkan.
Selain itu, mengikut spesifikasi:
When the criteria for elision of a copy operation are met and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue.
Ini menunjukkan bahawa apabila mengembalikan nilai (objek bernama) dengan bergerak, pengkompil akan cuba menyelesaikan pemilihan pembina seolah-olah ia adalah nilai r (objek sementara).
Butiran Pelaksanaan:
Pengoptimuman ini dilaksanakan melalui teknik penyusun. Dalam kes di mana penghapusan salinan dibenarkan, pengkompil terus mencipta objek yang dikembalikan di lokasi memori yang ditetapkan tanpa menjalani pembinaan salinan. Pendekatan ini memastikan objek yang dikembalikan adalah unik dan mengelakkan penciptaan dan pemusnahan objek yang tidak perlu.
Adalah penting untuk ambil perhatian bahawa tingkah laku ini khusus untuk C 0x, dan dalam versi C sebelumnya, mengembalikan penunjuk unik mengikut nilai akan biasanya mengakibatkan tingkah laku yang tidak ditentukan atau ralat pengkompil.
Atas ialah kandungan terperinci Bagaimanakah Mengembalikan Penunjuk Unik Mengikut Nilai Mengelakkan Pembinaan Salin dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!