Bagikan melalui


/Zc:nrvo (Kontrol NRVO opsional)

Opsi /Zc:nrvo pengkompilasi mengontrol standar C++ opsional bernama return value optimization (NRVO) copy atau move elision behavior.

Sintaks

/Zc:nrvo[-]

Keterangan

Di Visual Studio 2022 versi 17.4 dan yang lebih baru, Anda dapat secara eksplisit mengaktifkan perilaku penyalinan atau pemindahan elisi opsional dengan menggunakan /Zc:nrvo opsi pengkompilasi. Opsi ini nonaktif secara default, tetapi diatur secara otomatis saat Anda mengkompilasi menggunakan /O2 opsi, /permissive- opsi, atau /std:c++20 yang lebih baru. Di bawah /Zc:nrvo, salin dan pindahkan elisi dilakukan sedapat mungkin. Elisi salin atau pemindahan opsional juga dapat dinonaktifkan secara eksplisit dengan menggunakan /Zc:nrvo- opsi . Opsi pengkompilasi ini hanya mengontrol penyalinan opsional atau memindahkan elisi. Penyalinan wajib atau elisi pemindahan (ditentukan oleh C++ Standard) tidak dapat dinonaktifkan.

Salin wajib dan pindahkan elisi

Standar C++ memerlukan elisi salin atau pemindahan saat nilai yang dikembalikan diinisialisasi sebagai bagian dari pernyataan pengembalian. Misalnya, diperlukan saat fungsi mengembalikan yang ExampleType dikembalikan dengan menggunakan return ExampleType();. Pengkompilasi MSVC selalu melakukan penyalinan dan pemindahan elisi untuk return pernyataan ketika diperlukan, bahkan di bawah /Zc:nrvo-.

Salin dan pindahkan elisi opsional

return Saat pernyataan berisi ekspresi jenis non-primitif, eksekusinya menyalin hasil ekspresi ke slot pengembalian fungsi panggilan. Pengkompilasi memanggil konstruktor salinan atau pemindahan dari jenis yang dikembalikan. Kemudian, saat fungsi keluar, destruktor untuk variabel fungsi-lokal dipanggil, yang mencakup variabel apa pun yang dinamai dalam ekspresi.

Standar C++ memungkinkan (tetapi tidak memerlukan) pengkompilasi untuk secara opsional membuat objek yang dikembalikan langsung di slot pengembalian fungsi panggilan. Konstruksi ini melompati (atau elide) konstruktor salinan atau pemindahan yang dijalankan sebagai bagian return dari pernyataan. Tidak seperti kebanyakan pengoptimalan lainnya, transformasi ini diizinkan untuk memiliki efek yang dapat diamati pada output program. Yaitu, konstruktor salinan atau pemindahan dan destruktor terkait disebut satu kali lebih sedikit. Standar masih mengharuskan variabel bernama yang dikembalikan memiliki konstruktor salinan atau pemindahan yang ditentukan, bahkan jika kompilator elides konstruktor dalam semua kasus.

Dalam versi sebelum Visual Studio 2022 versi 17.4, ketika pengoptimalan dinonaktifkan (seperti di bawah /Od atau dalam fungsi yang ditandai #pragma optimize("", off)) pengkompilasi hanya melakukan penyalinan wajib dan pemindahan elisi. Di bawah /O2, pengkompilasi yang lebih lama melakukan salinan opsional atau memindahkan elisi pada pengembalian variabel bernama dalam fungsi yang dioptimalkan ketika semua kondisi ini terpenuhi: tidak memiliki perulangan atau penanganan pengecualian, itu tidak mengembalikan beberapa simbol dengan masa pakai yang tumpang tindih, konstruktor salinan atau pemindahan jenis tidak memiliki argumen default.

Visual Studio 2022 versi 17.4 meningkatkan jumlah tempat di mana pengkompilasi melakukan salinan opsional atau memindahkan elisi di bawah /Zc:nrvo, baik diaktifkan secara eksplisit, atau otomatis dengan menggunakan /O2opsi , , /permissive-atau yang /std:c++20 lebih baru. Di bawah /Zc:nrvo, pengkompilasi melakukan salinan opsional atau memindahkan elisi pada pengembalian variabel bernama untuk fungsi apa pun ketika: tidak memiliki perulangan atau penanganan pengecualian (seperti sebelumnya); mengembalikan variabel dari perulangan; ia memiliki penanganan pengecualian; konstruktor salinan atau pemindahan jenis yang dikembalikan memiliki argumen default. Elisi salinan atau pemindahan opsional tidak pernah dilakukan saat /Zc:nrvo- diterapkan, atau ketika fungsi mengembalikan beberapa simbol dengan masa pakai yang tumpang tindih, atau untuk melempar variabel bernama.

Untuk informasi selengkapnya dan contoh elisi salinan wajib dan opsional di bawah /Zc:nrvo, lihat Meningkatkan Salin dan Pindahkan Elisi di Blog Tim C++.

Untuk mengatur opsi pengkompilasi ini di Visual Studio

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.

  3. Di Opsi tambahan, tambahkan /Zc:nrvo atau /Zc:nrvo-. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.

Baca juga

/Zc (Kesuaian)
/O2
/permissive-
/std (Tentukan versi standar bahasa)