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

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

Linda Hamilton
Linda Hamiltonasal
2024-11-15 08:17:02324semak imbas

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));

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:
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