Czy można wyłączyć funkcję RVO (optymalizacja wartości zwracanej) w programie Visual Studio 2010? Ustawienie flagi optymalizacji na /Od
(wyłącza wszystkie optymalizacje) nie pomaga. W g ++ istnieje flaga -fno-elide-constructors
, która wyłącza RVO.Jak wyłączyć optymalizację wartości zwracanej w programie Visual Studio 2010?
Odpowiedz
Nie możesz. To takie proste. RVO/NRVO jest standardem, a twój kod nie powinien zależeć od tego, czy nie jest obecny.
Spróbuj zdefiniować zmienną jako volatile
, być może rozwiązuje problem. Jeśli nie, należy wysłać kod przychodzący ...
+1; chociaż jest to po prostu przypadkowe odgadnięcie (i jako takie zasługuje na pochwałę), poprawne jest to, że 'return my_volatile_variable;' wyłącza RVO. (C++ 11 § 12,8/31 pozycja 1.) – Potatoswatter
@Potatoswatter: Jestem ciekawy, dlaczego pomyślałeś o mojej odpowiedzi jako zwykłe przypuszczenie. "Być może" w mojej odpowiedzi oznaczało, że nie byłem pewien tej odpowiedzi, ponieważ nie wiedziałem, jaki jest prawdziwy problem. IMHO, to pytanie jest w stylu http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Malkocoglu
Ah, przepraszam. Przypuszczam, że to jest powód, dla którego cię aresztowali. (Lepiej uzasadnić odpowiedź z udziałem 'volatile'.) – Potatoswatter
Nie ma żadnego powodu, aby wyłączyć tę optymalizację! Co próbujesz osiągnąć? Pomaga debugować kompilacje działa szybciej bez żadnych złych efektów ubocznych. Zapewnia to również, że kod zależny od RVO lub NRVO działa identycznie w debugowaniu i wydaniu.
Potrafię wymyślić jeden (przynajmniej dla mnie) bardzo ważny powód: edukacja! Jak wyjaśnić konstruktorom, przenieść/skopiować konstruktory, destruktory w wywołaniach funkcji do ucznia, gdy kompilator je pominie!?! Jestem bardzo wdzięczny za g ++ za wspieranie takiej opcji. – Goran
Muszę to wyłączyć, aby zrozumieć czas życia zwróconej wartości, nie mogę tego teraz zrozumieć, ponieważ nie tworzy tymczasowego, po prostu kopiuje je prosto. – Zebrafish
O ile mogę powiedzieć RVO/NRVO jest ** nie ** Standard (patrz standard C++ 0x, sekcja 12.8. Kopiowanie i przenoszenie obiektów klasy, paragraf 32). Standard po prostu pozwala na taką optymalizację (g ++ i VisualStudio ją implementuje). Nie mam z tym zadnego problemu. Ale byłoby miło mieć przełącznik, aby go wyłączyć. Może dla celów edukacyjnych. Dziękuję, teraz jest o wiele jaśniej :) – Goran
@Goran: Jeśli Standard wyraźnie pozwala na to, to jest Standard. – Puppy
Allow! = Require. Jako taki nie jest częścią normy, to po prostu nie będzie sprzeczne ze standardem. –