¿Cómo puedo evitar la copia de objetos de peso mosca?
-
09-12-2019 - |
Pregunta
Estoy aprendiendo usando PEWEWS PEWHEYS KEY_VALUE y escribí el siguiente 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");
}
}
Cuando lo ejecuto, obtuve la salida de Follwing:
created bar
Copied
Destroyed bar
Destroyed bar
Me gustaría evitar la copia extra, ya que mi verdadero foo es bastante caro de copiar.Esta es también la razón principal por la que estoy usando un peso mosca.Entonces, ¿hay una manera de evitar la copia extra?
Solución
No debe preocuparse por eso, ya que el compilador puede optimizar esto, en algunos casos, utilizando RVO.Use las opciones del compilador para habilitar esa optimización siempre que sea posible.
y especialmente con C ++ 11, casi nunca debe preocuparse por ello, ya que ha introducido movimiento-semántica que no le cuesta mucho, incluso si algunos objetos temporales se crean sobre la mosca en un patrón de peso mueble.