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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top