Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Mengembalikan Penunjuk Unik Mengikut Nilai Mengelakkan Pembinaan Salin dalam C ?

Bagaimanakah Mengembalikan Penunjuk Unik Mengikut Nilai Mengelakkan Pembinaan Salin dalam C ?

Patricia Arquette
Lepaskan: 2024-12-12 17:34:12
asal
990 orang telah melayarinya

How Does Returning a Unique Pointer by Value Avoid Copy Construction in C  ?

Pulangan mengikut Nilai dalam Petunjuk Unik: Memahami Pengecualian

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 [...].
Salin selepas log masuk

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.
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan