フライウェイトオブジェクトのコピーを防ぐにはどうすればよいですか。

StackOverflow https://stackoverflow.com//questions/9620077

  •  09-12-2019
  •  | 
  •  

質問

key_value flyweightsを使って学んでいて、次のコードを書きました:

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

私が走るとき、私は次の成果を得た:

created bar
Copied
Destroyed bar
Destroyed bar
.

私の本物のfooはコピーにかなり高価なので、追加のコピーを避けたいと思います。これは私がフライウェイトを使っている主な理由です。だから、追加コピーを避ける方法はありますか?

役に立ちましたか?

解決

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top