Nehmen wir an, ich habe struct Foo
mit Bewegung constructor
und operator=(Foo&&)
, und ich benutzte es als Daten Mitglied:C++ Std :: Umzug ist hier schlecht?
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
Bei (2) ich nicht wirklich std::move
brauchen, aber was ist, wenn ich es benutzt hier macht dies etwas schlechtes, wie verhindern Optimierung?
Ich lese diese: Why does std::move prevent RVO?
und finden Sie heraus, dass return foo;
-return std::move(foo);
Ursache Sperrung des RVO
ändern, aber was (2) es eine ähnliche Situation verursacht? Und wenn ja, warum?
Kopieren Elision würde in diesem Fall sowieso nicht gelten, weil Sie 'foo.operator =' aufrufen. Es wäre relevant, wenn Sie 'Foo foo = std :: move (f());' haben, was die Initialisierung ist. –
@ M.M Aber "clang 3.7" warnen darüber, so frage ich mich, ist es Bug in der Warnung Generation, oder ich habe etwas verpasst – user1244932
Es kann schlecht sein, aus Gründen, die nicht Leistung Gründen zu. In Ihrem Fall für # 2, Sie kümmern sich std :: move (f()) auf etwas, das bereits ein rhr ist, so ist die Bewegung verschwendet Zeichen. Meine Faustregel ist, dass Sie std :: move vermeiden sollten, es sei denn Sie müssen, und Sie müssen nur, wenn Sie Eigentumsrechte in einer nicht-trivialen Weise übertragen. – IdeaHat