Visual Studio 2010'da RVO'yu (dönüş değeri optimizasyonu) devre dışı bırakmak mümkün müdür? Optimizasyon bayrağını /Od
'a ayarlamak (tüm optimizasyonları kapatır) yardımcı olmaz. G ++ 'da RVO'yu devre dışı bırakan -fno-elide-constructors
bayrağı bulunur.Visual Studio 2010'da geri dönüş değeri optimizasyonu nasıl devre dışı bırakılır?
cevap
Yapamazsınız. Sadece bu kadar basit. RVO/NRVO Standarttır ve kodunuz mevcut olmamasına bağlı olmamalıdır.
Değişkeninizi volatile
olarak tanımlamaya çalışın, sorununuzu çözebilir. Değilse, kodu göndermelisiniz ...
+1; Bu sadece rastgele bir tahmindir (ve bu nedenle aşağı inme hak ediyor) olmasına rağmen, 'my_volatile_variable' dönüşü, RVO'yu devre dışı bırakır. (C++ 11 §12.8/31 madde 1.) – Potatoswatter
@Potatoswatter: Cevabımı neden sadece rastgele bir tahmin olarak düşündüğünüzü merak ediyorum. Cevabımdaki "belki", bu sorunun ne olduğundan emin olmadığım için gerçek sorunun ne olduğunu bilmediğim anlamına geliyordu. IMHO, bu soru, http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Malkocoglu
Ah, özür dilerim. Sanırım seni bu yüzden reddettiler. (“Volatile” ile ilgili bir cevabı haklı çıkarmak daha iyidir.) – Potatoswatter
Bu optimizasyonu devre dışı bırakmak için herhangi bir sebep yoktur! Neyi başarmaya çalışıyorsun? Hata ayıklama işlemlerinin, herhangi bir kötü yan etki olmadan daha hızlı çalışmasına yardımcı olur. Ayrıca, RVO'ya veya NRVO'ya bağlı kodun hata ayıklama ve serbest bırakmada aynı şekilde çalışmasını sağlar.
Birini (en azından benim için) çok önemli bir sebep olarak düşünebilirim: eğitim! Derleyicileri ihmal ettiğinde, yapıcıları nasıl açıklar, kurucuları/taşınırları, işlev çağrılarındaki yıkıcıları nasıl açıklarsınız? Böyle bir seçeneği desteklemek için g ++ 'ya çok müteşekkirim. – Goran
Döndürülmüş bir değerin ömrünü anlamak için onu devre dışı bırakmak zorundayım, bunu şimdi anlayamıyorum çünkü geçici yaratmıyor, sadece doğrudan kopyalar. – Zebrafish
RVO/NRVO'ya ** değinebileceği kadarıyla ** standart değil (bkz. C++ 0x standardı, bölüm 12.8. Sınıf nesnelerini kopyalama ve taşıma, paragraf 32)). Standart, bu tür bir optimizasyona izin verir (g ++ ve VisualStudio bunu uygular). Bununla bir problemim yok. Ama devre dışı bırakmak için biraz geçiş yapmak güzel olurdu. Eğitim amaçlı belki. Teşekkürler, şimdi çok daha net :) – Goran
@Goran: Standart açıkça izin veriyorsa, o zaman Standarttır. – Puppy
İzin! = Gerektirir. Standartın bir parçası olmadığı için standartla çelişmez. –