2012-03-08 19 views
0

私はKEY_VALUEフライウェイトを使用して学んでいると私は次のコードを書きました:私は、余分なコピーを避けたいのですがフライウェイトオブジェクトのコピーを防止するにはどうすればよいですか?

created bar 
Copied 
Destroyed bar 
Destroyed bar 

:私はそれを実行すると、私はfollwing出力を得た

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

を私の本物のFooはコピーするのにかなりの費用がかかるからです。これは、私がフライウェイトを使用している主な理由でもあります。だから、余分なコピーを避ける方法はありますか?

+0

ここでこのコードで遊ぶことができます:http://ideone.com/Xpjmk – Emiliano

+0

コンパイラは何ですか?実際のFoo型で移動コンストラクタを実装できますか? –

答えて

1

コンパイラは、RVOを使用してこれを最適化することがありますので、心配する必要はありません。コンパイラオプションを使用して、可能な限り最適化を有効にします。

特にC++ 11では、一時的なオブジェクトがフライウェイトパターンで即座に作成されたとしても、コストがかからない移動セマンティクスが導入されているため、ほとんど心配する必要はありません。

関連する問題