Supponiamo che ho struct Foo
con mossa constructor
e operator=(Foo&&)
, e ho usato come membro di dati:C++ std :: move is bad here?
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
In caso (2) Io in realtà non hanno bisogno std::move
, ma se l'ho usato qui , questo fa qualcosa di male, come prevenire l'ottimizzazione?
ho letto questo: Why does std::move prevent RVO?
e scoprire che la modifica return foo;
-return std::move(foo);
causa disabilitazione di RVO
, ma per quanto riguarda (2) lo fa causa alla situazione simile? E se sì, perché?
Copia elisione non si applica in questo caso comunque perché si sta chiamando 'foo.operator ='. Sarebbe rilevante se tu avessi "Foo foo = std :: move (f());" che è l'inizializzazione. –
@ M.M Ma 'clang 3.7' avverto su questo, quindi mi chiedo, è un bug nella generazione di avvisi, o mi sono perso qualcosa – user1244932
Può essere negativo per motivi che non sono anche motivi di prestazioni. Nel tuo caso per # 2, tieni a chiamare std :: move (f()) su qualcosa che è già un rhr, quindi la mossa è sprecata caratteri. La mia regola generale è che dovresti evitare std :: move a meno che non sia necessario, e devi farlo solo quando trasferisci la proprietà in modo non banale. – IdeaHat