Rumah > pembangunan bahagian belakang > C++ > Mengapa Melepasi Objek melalui Rujukan kepada std::thread Menjemput Pembina Salin?

Mengapa Melepasi Objek melalui Rujukan kepada std::thread Menjemput Pembina Salin?

Linda Hamilton
Lepaskan: 2024-11-15 08:17:02
asal
432 orang telah melayarinya

Why Does Passing an Object by Reference to std::thread Invoke the Copy Constructor?

std::thread: Pass by Reference Invokes Copy Constructor

Memahami Isu

Apabila menghantar objek ke std::thread, hujah biasanya disalin ke dalam benang, bukannya dirujuk. Tingkah laku ini bercanggah dengan jangkaan bahawa melalui rujukan harus mengelakkan pembinaan salinan. Kekeliruan berpunca daripada perbezaan antara rujukan dan penunjuk dalam C .

Salin Pembina dan Lulus Rujukan

Dalam C , menghantar objek melalui rujukan secara amnya bermaksud menghantar alamatnya, yang bersamaan dengan lulus penunjuk. Walau bagaimanapun, std::thread mempunyai pelaksanaan khusus yang memerlukan argumennya disalin mengikut nilai.

Menggunakan std::reference_wrapper

Untuk mencapai semantik rujukan, gunakan std::reference_wrapper seperti berikut:

std::thread newThread(session, &sock, std::ref(logger));
Salin selepas log masuk

Dengan cara ini, pembalak tidak disalin, sebaliknya rujukannya dihantar kepada utas. Ambil perhatian bahawa pembalak mesti hidup lebih lama daripada urutan.

Semantik Bergerak

Penggunaan std::move() tidak disyorkan dalam kes ini kerana std::thread menjangkakan argumen akan disalin. Mengalihkan objek akan memindahkan pemilikan memorinya kepada urutan, yang mungkin tidak diingini.

Jika kod anda sebelum ini berfungsi dengan std::move() tetapi kini gagal, kemungkinan versi pengkompil anda tidak melaksanakan C 11 sepenuhnya. Pertimbangkan untuk mengemas kini pengkompil anda untuk sokongan C 11 yang dipertingkatkan.

Atas ialah kandungan terperinci Mengapa Melepasi Objek melalui Rujukan kepada std::thread Menjemput Pembina Salin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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