Почему & quot; boost :: function = boost :: bind (…) & quot; создание 13 временных?

У меня есть довольно простой тестовый код. У меня есть класс, который просто записывает все операции над ним. Я связал это с 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, Поэтому создание хотя бы одной копии обязательно. Тем не менее, я считаю, что я получаю 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) чтобы избежать абсурдного количества копий?

Полный код и демонстрацию проблемы можно найти на кодовой панели.

12

Решение

Если вы удалите часть назначения «func =», количество копий уменьшится до 4, что намного лучше, чем 13.

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

Так что решение простое — не используйте boost :: function

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]