2016-06-21 6 views
2

Ich würde gerne wissen, ob es überhaupt notwendig ist, Werte explizit zu verschieben, wenn ich nicht in einer Move-Konstruktor-/Move-Zuweisung bin. Lets sagt, dass ich die folgende Situation: mehr in der nachfolgenden CodeSollte ich einen Wert verschieben, den ich nicht mehr verwende?

struct Node 
{ 
    std::vector<int> items; 
}; 

Node create() 
{ 
    std::vector<int> items; 
    items.push_back(2); 

    Node n; 
    // should I use n.items = std::move(items); 
    // instead? 
    n.items = items; 

    // other code, not using items any more 

    return n; 
} 

Zunächst einmal ist es richtig, einen L-Wert mit std::move versehen zu bewegen, dass ich nicht den verschobenen Wert verwenden?

Zweitens ist es schneller, den Wert explizit zu verschieben, oder erkennt der Compiler automatisch, dass der Wert verschoben werden kann?

+0

ein Umzug ist besser als eine Kopie – vu1p3n0x

+3

Warum instanziieren Sie 'n' früher und sparen Sie sich den Ärger, indem Sie direkt in' n.items' drücken? – user4581301

+0

@ user4581301 ist richtig. Kannst du dir ein nicht-konvertiertes Beispiel einfallen lassen? –

Antwort

0

Das Verschieben eines L-Werts ist in Ordnung, solange Sie sich erinnern, dass Lvalue möglicherweise nicht mehr gültig ist. Sie können etwas darüber kopieren und es wird wieder gut, aber.

Das Verschieben des Inhalts eines Vektors ist im Allgemeinen schneller als das Kopieren, da er nur den zugrunde liegenden Zeiger (und eine Größenvariable) austauschen muss, anstatt jedes Element einzeln im Vektor zu kopieren. Etwas Einfaches wie ein Int zu bewegen, ist allerdings etwas albern.

Schließlich würde es in Ihrem Beispiel sicherlich nicht schaden, explizit zu sein. items ist ein Lvalue. Wenn Ihr Compiler also nicht schlau genug ist, um zu sehen, dass Elemente überhaupt nie wieder verwendet werden, wird er wahrscheinlich die Semantik der Kopie verwenden. Explizit würde also helfen.

+0

Nun, das Szenario ist, dass der Vektor * mehr * enthält als ein Artikel, das Beispiel ist wirklich nur illustrativ :) – hfhc2

1

Sie können sich bewegende vermeiden und lassen Sie es zu der Initialisierung eines Objekts und Optimierung des Compilers:

struct Node 
{ 
    std::vector<int> items; 
}; 

Node create() 
{ 
    std::vector<int> items; 
    // ... 
    return Node{items}; 
} 

Der übliche Rat ist: Verwenden Sie keine vorschnellen manuelle Optimierungen anwenden.