gpt4 book ai didi

c++ - 为什么 "boost::function = boost::bind(...)"会创建 13 个临时对象?

转载 作者:IT老高 更新时间:2023-10-28 23:21:32 24 4
gpt4 key购买 nike

我有一些非常基本的测试代码。我有一个只记录所有操作的类。我将它绑定(bind)到 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

我不能使用 refcref 因为我确实需要它来制作对象的拷贝。我做错了什么可怕的事情吗?或者我是否需要使用包装器(如 boost::shared_ptr)来避免数量过多的拷贝?

完整代码及问题演示可见on Codepad .

最佳答案

如果您删除“func =”分配部分,拷贝数会降低到 4 个,这比 13 个要好。

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

所以解决方案很简单——不要使用 boost::function

关于c++ - 为什么 "boost::function = boost::bind(...)"会创建 13 个临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14617835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com