0

私は 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 はコピーするのにかなりのコストがかかるので、余分なコピーは避けたいと思います。これは、私がフライウェイトを使用している主な理由でもあります。それで、余分なコピーを避ける方法はありますか?

4

1 に答える 1

1

場合によっては RVO を使用して、コンパイラがこれを最適化する可能性があるため、心配する必要はありません。コンパイラ オプションを使用して、可能な限りこのような最適化を有効にしてください。

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

于 2012-03-08T15:26:55.627 に答える