У меня есть довольно простой тестовый код. У меня есть класс, который просто записывает все операции над ним. Я связал это с 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
) чтобы избежать абсурдного количества копий?
Полный код и демонстрацию проблемы можно найти на кодовой панели.
Если вы удалите часть назначения «func =», количество копий уменьшится до 4, что намного лучше, чем 13.
template <class F>
void callF(F fun)
{
}
callF(boost::bind(&func, fl));
Так что решение простое — не используйте boost :: function
Других решений пока нет …