Question

J'apprends à l'aide de Key_Value Flyweights et j'ai écrit le code suivant:

#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");
}
}

Quand je l'exécute, j'ai eu la sortie Follwing:

created bar
Copied
Destroyed bar
Destroyed bar

J'aimerais éviter la copie supplémentaire, car mon vrai foo est assez coûteux à copier.C'est aussi la principale raison pour laquelle j'utilise un poids volé.Alors, y a-t-il un moyen d'éviter l'extra-copie?

Était-ce utile?

La solution

Vous ne devriez pas vous inquiéter de cela, car le compilateur peut l'optimiser, dans certains cas, à l'aide de la RVO.Utilisez des options du compilateur pour activer une telle optimisation dans la mesure du possible.

Et surtout avec C ++ 11, vous ne devriez presque jamais vous en soucier, car elle a introduit une sémantique de déplacement qui ne vous coûte pas beaucoup de coûts, même si certains objets temporaires sont créés à la volée du modèle volant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top