Considerare:Devo std: spostare un shared_ptr in un costruttore di move?
#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below
private:
shared_ptr<string> foo_;
};
/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/
// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}
int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});
random_shuffle(gizmos.begin(), gizmos.end());
}
Nel codice sopra, ci sono due versioni di Gizmo::Gizmo(Gizmo&&)
- uno usa std::move
realmente mossa il shared_ptr
, e l'altro appena copia il shared_ptr
.
Entrambe le versioni sembrano funzionare in superficie. Una differenza (l'unica differenza che posso vedere) è nella versione non move
il conteggio dei riferimenti dello shared_ptr
è temporaneamente aumentato, ma solo brevemente.
Vorrei normalmente andare avanti e move
il shared_ptr
, ma solo per essere chiari e coerenti nel mio codice. Mi manca una considerazione qui? Dovrei preferire una versione rispetto all'altra per una ragione tecnica ?
Lo spostamento in un costruttore di movimento è almeno semanticamente coerente ... – ildjarn
Perché mantieni la stringa in un shared_ptr? Un shared_ptr come variabile membro è il più delle volte un segno di cattiva progettazione. –
Lo spostamento in un costruttore di movimento è in linea con ciò che il compilatore genererebbe automaticamente. –