Przenoszenie semantyki może być przydatne, gdy kompilator nie może używać RVO i NRVO. Ale w takim przypadku kompilator nie może korzystać z tych funkcji?Kiedy nie można użyć kompilatora RVO lub NRVO?
Odpowiedz
Odpowiedź jest taka, że zależy od kompilatora i sytuacji. Na przykład. kontrolne rozgałęzienie przepływu może dezorientować optymalizatorów. Wikipedia podać następujący przykład:
#include <string>
std::string f(bool cond = false) {
std::string first("first");
std::string second("second");
// the function may return one of two named objects
// depending on its argument. RVO might not be applied
return cond ? first : second;
}
int main() {
std::string result = f();
}
Cóż, nie chodzi o to, czy kompilator może korzystać z RVO, ale czy dzięki temu można uniknąć konstrukcji kopii.
Rozważmy:
struct Blah
{
int x;
Blah(int const _x): x(_x) { cout << "Hum de dum " << x << endl; }
};
Blah foo()
{
Blah const a(1);
if(fermatWasRight()) { return Blah(2); }
return a;
}
Pierwsze efekty uboczne (wyjście z konstruktora) tutaj, to na pierwszy rzut oka całkiem niezgodne z budowy a
directy w zakresie przechowywania przewidzianym przez rozmówcę. Ale jeśli kompilator jest wystarczająco inteligentny, to może zauważyć, że niszczenie tego obiektu jest operacją zerową. I bardziej ogólnie, dla jakiejkolwiek konkretnej sytuacji, jeśli kompilator jest wystarczająco inteligentny, może uda mu się uniknąć operacji kopiowania, niezależnie od tego, jak podstępnie projektujemy kod.
Nie jestem pewien formalności, ale powyższe, z większą ilością ładunku w obiekcie, dzięki czemu kopiowanie byłoby droższe, to jeden przypadek, w którym semantyka ruchu może pomóc, więc optymalizacja będzie gwarantowana bez względu na sprytów kompilatora (lub nie).
- 1. kiedy użyć tkaniny lub ansibla?
- 2. Kiedy wiesz, kiedy użyć TreeSet lub LinkedList?
- 3. Kiedy użyć #define lub stałej char/int?
- 4. Którego kompilatora D użyć?
- 5. django - kiedy należy użyć media_root lub static_root?
- 6. zmq - kiedy użyć zmq_bind lub zmq_connect
- 7. Nie można użyć Ruby
- 8. Jak programowo użyć kompilatora JDT?
- 9. Aby użyć lub nie użyć wzorca stanu?
- 10. RVO, operacje przeniesienia i dylemat
- 11. Nie można znaleźć folderu kompilatora WebPacka
- 12. Kiedy należy użyć mmap
- 13. Jquery - Kiedy użyć "this" i kiedy użyć "$ (this)"?
- 14. Nie można użyć Server.MapPath
- 15. Nie można znaleźć kompilatora Javac podczas kompilacji z maven - Nie można zlokalizować kompilatora Javac w:
- 16. Nie można użyć SSSE3 na włączonym procesorze
- 17. Czy RVO stanie się po powrocie std :: pair?
- 18. Czy optymalizacja wartości zwracanej (RVO) nie jest błędem?
- 19. Nie można użyć parametru ref lub out w wyrażeniach lambda
- 20. nie można użyć ciągu "wykonaj (" w GET lub POST
- 21. Dlaczego nie mogę użyć elementów wewnętrznych kompilatora w bloku ASM?
- 22. Nie można użyć funkcji React.findDOMNode
- 23. Kiedy użyć sprężyny: tag URL?
- 24. Nie można użyć git subtree pull
- 25. Kiedy należy użyć sqlalchemy back_populates?
- 26. form_for i form_tag, kiedy użyć?
- 27. Tworzenie instancji PHP. Aby użyć lub nie użyć nawiasów?
- 28. Błąd kompilatora bitowego lub narożnik?
- 29. Django kiedy użyć metody przerywaniem
- 30. Kiedy użyć narzędzia do budowania?
Sprawdź to pytanie: [C++: Unikanie kopię z „powrót” oświadczenie] (http://stackoverflow.com/questions/10476665/c-avoiding-copy-with-the- return-statement) :) – LihO