/Zc:nrvo
(İsteğe bağlı NRVO'ları denetleme)
Derleyici seçeneği Standart /Zc:nrvo
C++ isteğe bağlı adlandırılmış dönüş değeri iyileştirme (NRVO) kopyalama veya taşıma elision davranışını denetler.
Sözdizimi
/Zc:nrvo
[-
]
Açıklamalar
Visual Studio 2022 sürüm 17.4 ve sonraki sürümlerinde, derleyici seçeneğini kullanarak /Zc:nrvo
isteğe bağlı kopyalama veya taşıma elision davranışını açıkça etkinleştirebilirsiniz. Bu seçenek varsayılan olarak kapalıdır, ancak seçeneği, /permissive-
seçeneği veya /std:c++20
üzerini /O2
kullanarak derleme yaptığınızda otomatik olarak ayarlanır. altında /Zc:nrvo
, kopyalama ve taşıma elisyonu mümkün olan her yerde gerçekleştirilir. İsteğe bağlı kopyalama veya taşıma elision seçeneği kullanılarak /Zc:nrvo-
açıkça devre dışı bırakılabilir. Bu derleyici seçenekleri yalnızca isteğe bağlı kopyalama veya taşıma seçeneğini denetler. Zorunlu kopyalama veya taşıma iznamesi (C++ Standardı tarafından belirtilen) devre dışı bırakılamaz.
Zorunlu kopyalama ve taşıma elision
Döndürülen değer return deyiminin bir parçası olarak başlatıldığında C++ standardı kopyalama veya taşıma imasion gerektirir. Örneğin, bir işlev kullanarak return ExampleType();
döndürülen döndürdüğünde ExampleType
gereklidir. MSVC derleyicisi, altında /Zc:nrvo-
bile gerektiğinde deyimler için return
her zaman kopyalama ve taşıma elision işlemi gerçekleştirir.
İsteğe bağlı kopyalama ve taşıma elision
Bir return
deyim ilkel olmayan türde bir ifade içerdiğinde, yürütmesi ifade sonucunu çağıran işlevin dönüş yuvasına kopyalar. Derleyici, döndürülen türün kopya veya taşıma oluşturucusunu çağırır. Ardından, işlevden çıkıldığında, işlev yerel değişkenleri için yıkıcılar çağrılır ve ifadede adlı tüm değişkenleri içerir.
C++ standardı, derleyicinin isteğe bağlı olarak döndürülen nesneyi doğrudan çağıran işlevin dönüş yuvasında oluşturmasına izin verir (ancak gerektirmez). Bu yapı, deyiminin bir parçası olarak yürütülen kopya veya taşıma oluşturucuyu return
atlar (veya elides). Diğer iyileştirmelerin çoğundan farklı olarak, bu dönüşümün programın çıktısı üzerinde gözlemlenebilir bir etkiye sahip olması sağlanır. Yani, kopyalama veya taşıma oluşturucu ve ilişkili yıkıcı bir kez daha az çağrılır. Derleyici her durumda oluşturucuyu ilerletse bile standart, adlandırılmış döndürülen değişkenin tanımlı bir kopya veya taşıma oluşturucuya sahip olmasını gerektirir.
Visual Studio 2022 sürüm 17.4'ün önceki sürümlerinde, iyileştirmeler devre dışı bırakıldığında (örneğin, altında /Od
veya işaretli #pragma optimize("", off)
işlevlerde) derleyici yalnızca zorunlu kopyalama ve taşıma elisyonu gerçekleştirir. altında /O2
, eski derleyiciler, bu koşulların tümü karşılandığında adlandırılmış bir değişkenin iyileştirilmiş bir işlevde döndürülmesi üzerine isteğe bağlı kopyalama veya taşıma elisyonu gerçekleştirir: döngüleri veya özel durum işlemesi yoktur, çakışan ömürleri olan birden çok simge döndürmez, türün kopya veya taşıma oluşturucusunun varsayılan bağımsız değişkenleri yoktur.
Visual Studio 2022 sürüm 17.4, derleyicinin üzerinde isteğe bağlı kopyalama veya taşıma imlerini /Zc:nrvo
açıkça etkinleştirilip etkinleştirilmediği veya , /permissive-
veya /std:c++20
daha sonraki seçenekleri kullanarak /O2
otomatik olarak yaptığı yer sayısını artırır. altında /Zc:nrvo
, derleyici herhangi bir işlev için adlandırılmış değişkenin döndürülmesiyle isteğe bağlı kopyalama veya taşıma imtiyazı gerçekleştirir: döngüleri veya özel durum işlemesi olmadığında (daha önce olduğu gibi); bir döngüden değişken döndürür; özel durum işlemeye sahiptir; döndürülen türün kopyalama veya taşıma oluşturucusunun varsayılan bağımsız değişkenleri vardır. İsteğe bağlı kopyalama veya taşıma imleri hiçbir zaman uygulandığında /Zc:nrvo-
veya işlev çakışan ömürleri olan birden çok simge döndürdüğünde ya da adlandırılmış bir değişkenin atlanması için yapılmaz.
altında /Zc:nrvo
zorunlu ve isteğe bağlı kopyalama imsion hakkında daha fazla bilgi ve örnekler için C++ Ekip Blogu'ndaki Kopyalama ve Taşıma elision'ını geliştirme bölümüne bakın.
Visual Studio'da bu derleyici seçeneğini ayarlamak için
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.
Ek seçenekler'de veya
/Zc:nrvo-
ekleyin/Zc:nrvo
. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.
Ayrıca bkz.
/Zc
(Uyumluluk)
/O2
/permissive-
/std
(Dil standart sürümünü belirtin)