2012-05-09 15 views
6

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?

+0

Sprawdź to pytanie: [C++: Unikanie kopię z „powrót” oświadczenie] (http://stackoverflow.com/questions/10476665/c-avoiding-copy-with-the- return-statement) :) – LihO

Odpowiedz

5

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(); 
} 
3

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).

Powiązane problemy