2016-06-13 7 views
1

Zum Beispiel, ich habeWird der richtige Wert eines Arrays die Leistung verbessern?

class A 
{ 
    std::array<Object, 5> m_objects; 

    A(std::array<Object, 5> objects) 
     : m_objects(std::move(objects)) //does using right value will improve 
             // performance in some cases?? 
    {} 
}; 

Does richtigen Wert im Konstruktor wird die Leistung in einigen Fällen verbessern ??

+1

Nehmen Sie eine universelle Referenz, wenn Sie die Leistung verbessern möchten (in einigen Fällen) – tkausl

+0

Mögliche Duplikate? http://StackOverflow.com/Questions/14370730 –

+0

"richtigen Wert"? Meinst du "Rvalue" ?! –

Antwort

1

Sie sollten einen weiteren Konstruktor hinzufügen, um auch temporäre Arrays zu akzeptieren.

class A 
{ 
    std::array<Object, 5> m_objects; 

    A(std::array<Object, 5> objects) 
     : m_objects(std::move(objects)) 
    {} 
    A(std::array<Object, 5>&& robj): m_objects(std::move(robj)) 
    {} 
}; 

Sie auch hier, dass mit einem forwarding referenceT&&, aber ich habe aus Gründen der Klarheit hätte gehen können. Dies ist expliziter.

Beachten Sie auch, dass die Verwendung von move in diesem Fall nicht immer die Leistung garantiert. Für array bedeutet move, dass die von array gehaltenen Elemente verschoben werden. In diesem Fall Object Klasseninstanzen.

Damit dies besser funktioniert, SOLLTEN Sie eine move constructor Klasse Object bereitstellen, sonst wird der Verschiebevorgang hier nichts anderes als eine Kopie einzelner Object Instanzen sein.

HINWEIS: Der Move-Konstruktor des Object sollte billiger als der Kopierkonstruktor sein. Sonst gäbe es keinen Unterschied zwischen move und copy performance.

Verwandte Themen