Odpowiedz

7

Nie możesz. To takie proste. RVO/NRVO jest standardem, a twój kod nie powinien zależeć od tego, czy nie jest obecny.

+3

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

+0

@Goran: Jeśli Standard wyraźnie pozwala na to, to jest Standard. – Puppy

+2

Allow! = Require. Jako taki nie jest częścią normy, to po prostu nie będzie sprzeczne ze standardem. –

1

Spróbuj zdefiniować zmienną jako volatile, być może rozwiązuje problem. Jeśli nie, należy wysłać kod przychodzący ...

+0

+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

+0

@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

+0

Ah, przepraszam. Przypuszczam, że to jest powód, dla którego cię aresztowali. (Lepiej uzasadnić odpowiedź z udziałem 'volatile'.) – Potatoswatter

0

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.

+11

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

+0

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

Powiązane problemy