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
- 1. Jak wyłączyć pływające zakładki w Visual Studio 2010
- 2. Jak wyłączyć lokalizację błędów w programie Visual Studio?
- 3. Jak wyłączyć żarówkę w programie Visual Studio 2015?
- 4. Jak wyłączyć automatyczną realizację nawiasów/cudzysłowów w programie Visual Studio
- 5. Jak wyłączyć uzupełnianie klamr w programie Visual Studio 2012?
- 6. Jak wyłączyć optymalizację w LLVM
- 7. wiele okien wyjściowych w programie Visual Studio 2010
- 8. Dlaczego System.Diagnostics.Debug.WriteLine nie działa w programie Visual Studio 2010 C#?
- 9. Pierwsze kroki w programie Visual Studio 2010 Extensibility - 3 pytania
- 10. Czy w programie Visual Studio 2010 dostępny jest generator ToString()?
- 11. Makro w programie Visual Studio 2010, które ładuje plik ustawień
- 12. Usuń plik .pdb w visual studio 2010
- 13. WebsiteSpark & Visual Studio 2010
- 14. /LinkResource w Visual Studio 2010
- 15. UnInstall Visual Studio 2010
- 16. GTK # w Visual Studio 2010
- 17. HTML formatowanie w Visual Studio 2010
- 18. Czy istnieje sposób użycia oczekujących zmian w programie Visual Studio 2010/Eksploratora zespołu w programie Visual Studio 2012?
- 19. Jak zainstalować Crypto ++ w Visual Studio 2010?
- 20. Zastępowanie wyrażenia regularnego w programie Visual Studio
- 21. Jak wyłączyć optymalizację kompilatora w języku C#?
- 22. Folder z kropkami w programie Visual Studio
- 23. Visual Studio 2010 wiersze wiersz
- 24. Zmiana motywu Visual Studio 2010
- 25. Visual Studio 2010 (beta 2) rozwiązanie w Visual Studio 2008
- 26. Visual Studio 2010 - odinstalować NuGet
- 27. Odświeżenie programu Visual Studio 2010
- 28. Ograniczenia Visual Studio 2010 Express
- 29. Visual Studio 2010 referencje warunkowe
- 30. Visual Studio 2010 Team Explorer
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. –