Come posso impedire la copia di oggetti volanti?
-
09-12-2019 - |
Domanda
Sto imparando a utilizzare Key_Value Flyweights e ho scritto il seguente codice:
#include <iostream>
#include <string>
#include <boost/flyweight.hpp>
#include <boost/flyweight/key_value.hpp>
#include <boost/flyweight/no_locking.hpp>
class Foo
{
std::string name_;
public:
Foo(const std::string& name) { name_ = name; std::cout << "created " << name << "\n"; }
Foo(const Foo& f) { name_ = f.name_; std::cout << "Copied\n"; }
~Foo() {std::cout << "Destroyed " << name_ << "\n"; }
};
typedef boost::flyweight< boost::flyweights::key_value<std::string, Foo >, boost::flyweights::no_locking > FooLoader;
int main()
{
{
Foo myF = FooLoader("bar");
}
}
.
Quando lo eseguo ho ricevuto l'uscita FOLLWING:
created bar
Copied
Destroyed bar
Destroyed bar
.
Mi piacerebbe evitare la copia extra, dal momento che il mio vero foo è piuttosto costoso da copiare.Questa è anche la ragione principale che sto usando un peso flyweight.Quindi, c'è un modo per evitare la copia extra?
Soluzione
Non dovresti preoccuparti di questo come il compilatore può ottimizzare questo, in alcuni casi, usando RVO.Utilizzare le opzioni del compilatore per abilitare tale ottimizzazione ovunque possibile.
E soprattutto con C ++ 11, non dovresti quasi mai preoccuparti, poiché ha introdotto lo spostamento-semantics che non ti costano molto anche se alcuni oggetti temporanei vengono creati sul fly in flyweight pattern.