Il giorno domenica 13 ottobre 2019 19:44:03 UTC+2, enoquick ha scritto:
>
> che il caso 2 sia piu performante di 1 dipende da Foo(Foo&&); come e'
> fatto (quanta roba sposta e come la sposta)
> Occorre anche tenere conto che shared_ptr va su heap,generalmente piu
> lento come costruzione rispetto allo stack e comunque piu lento di
> unique_ptr
> Forse per una lista condivisa,se e' quello che si vuole ottenere (ma
> dipende dal problema), non e' meglio un shared_ptr<foo_list>
> senza stare a creare singoli elementi shared_ptr ?
L'esempio sposta tutta la lista, ma nel mio caso reale dovevo muovere solo determinati elementi che rispondono a una condizione.
Comunque la differenza è impressionante:
http://cpp.sh/2ch2v
*** No pointers (Primo esempio) ***
Constructor Foo() called for "Hello"
Move constructor Foo(Foo&& other) called for "Hello"
Constructor Foo() called for "collections"
Move constructor Foo(Foo&& other) called for "collections"
Constructor Foo() called for "!!"
Move constructor Foo(Foo&& other) called for "!!"
Assignment operator Foo& operator=(const Foo& other) called for "Hello"
Copy constructor Foo(const Foo& other) called for "Hello"
Assignment operator Foo& operator=(const Foo& other) called for "collections"
Copy constructor Foo(const Foo& other) called for "collections"
Assignment operator Foo& operator=(const Foo& other) called for "!!"
Copy constructor Foo(const Foo& other) called for "!!"
Destructor ~Foo() called for "!!"
Destructor ~Foo() called for "collections"
Destructor ~Foo() called for "Hello"
Destructor ~Foo() called for "???moved???"
Destructor ~Foo() called for "???moved???"
Destructor ~Foo() called for "???moved???"
Destructor ~Foo() called for "Hello"
Destructor ~Foo() called for "collections"
Destructor ~Foo() called for "!!"
*** With pointers (Secondo esempio) ***
Constructor Foo() called for "Hello"
Constructor Foo() called for "collections"
Constructor Foo() called for "!!"
Destructor ~Foo() called for "Hello"
Destructor ~Foo() called for "collections"
Destructor ~Foo() called for "!!"