Pergunta

Estou aprendendo a usar flyweights key_value e escrevi o seguinte código:

#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 o executo, obtive a seguinte saída:

created bar
Copied
Destroyed bar
Destroyed bar

Eu gostaria de evitar a cópia extra, já que meu Foo real é muito caro para copiar.Esta também é a principal razão pela qual estou usando um peso mosca.Então, existe uma maneira de evitar a cópia extra?

Foi útil?

Solução

Você não deve se preocupar com isso, pois o compilador pode otimizar isso, em alguns casos, usando RVO.Use as opções do compilador para ativar essa otimização sempre que possível.

E especialmente com o C++ 11, você quase nunca deve se preocupar com isso, pois ele introduziu a semântica de movimento que não custa muito, mesmo que alguns objetos temporários sejam criados dinamicamente no padrão flyweight.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top