12

かなり基本的なテストコードがあります。すべての操作をログに記録するだけのクラスがあります。boost::function私はそれを次のようなオブジェクトにバインドしました:

    void Function(const Foo&)
    {
        printf("Function invoked\n");
    }

    // ...

    boost::function<void(void)> func;
    {
        Foo f;
        printf("\nConstructing function\n");
        func = boost::bind(&Function, f);
        printf("Construction complete\n\n");
    }

関数オブジェクトにはのコピーが含まれていると思いますf。したがって、少なくとも1つのコピーを作成する必要があります。しかし、私は13の一時的なものを取得していることがわかりました。出力は次のとおりです。

Constructing function
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Construction complete

オブジェクトのコピーを作成するために使用できないrefか、必要なためです。cref私はひどく間違ったことをしていますか?boost::shared_ptrまたは、不条理な数のコピーを避けるために、ラッパー(のような)を使用する必要がありますか?

完全なコードと問題のデモンストレーションはCodepadにあります。

4

1 に答える 1

3

「func=」割り当て部分を削除すると、コピー数は4に減り、13よりもかなり多くなります。

template <class F>
void callF(F fun)
{
}
callF(boost::bind(&func, fl));

したがって、解決策は単純です-boost::functionを使用しないでください

于 2013-01-31T08:28:41.837 に答える