Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
boost::bind是否复制成员函数_Boost_Bind_Member Function Pointers - Fatal编程技术网

boost::bind是否复制成员函数

boost::bind是否复制成员函数,boost,bind,member-function-pointers,Boost,Bind,Member Function Pointers,Boost::bind文档状态: 默认情况下,bind生成所提供函数对象的副本。boost::ref和boost::cref可用于使其存储对函数对象的引用,而不是副本 当我使用boost::bind和指向成员函数的指针时,我在代码中看到了过多的新闻和删除。我不清楚boost::bind(&classname::functionname,…)是否复制了该函数 或者这个问题毫无意义,因为它将一个成员函数转换为一个函数对象,所以显然必须重新创建函数对象 所以我的问题是,有没有一种方法可以绑定到成员函数

Boost::bind文档状态:

默认情况下,bind生成所提供函数对象的副本。boost::ref和boost::cref可用于使其存储对函数对象的引用,而不是副本

当我使用boost::bind和指向成员函数的指针时,我在代码中看到了过多的新闻和删除。我不清楚boost::bind(&classname::functionname,…)是否复制了该函数

或者这个问题毫无意义,因为它将一个成员函数转换为一个函数对象,所以显然必须重新创建函数对象


所以我的问题是,有没有一种方法可以绑定到成员函数并避免new和delete?

复制的是指向该方法的指针,因此不涉及new/delete。
bind
返回的是一个函数对象,它在某个点被创建和销毁,但同样没有动态内存分配。

据我所知,如果在代码中使用boost::bind,例如创建一个函数对象作为find_中的谓词,如果函数对象被新建和删除,这就是导致我的代码运行缓慢的原因

我的问题是:有没有一种方法可以绑定到成员函数并避免new和delete

我通过遍历列表并通过成员函数指针调用成员函数来解决boost::bind问题

成员指针函数的类型是从列表及其存储的数据类型的模板参数派生出来的,但无论类型是否模板化,都可以使用相同的技术


此解决方案将用户对特定操作的响应感知从5分钟缩短为立即有效。

根据我的实验(boost 1.49),
boost::bind
不使用动态内存来实现自己的操作。使用此代码

#include <boost/bind.hpp>

int f(int a , int b) {
  return a>b ? a+b : a-b;
}

int main()
{
  auto a = boost::bind(f, _1, 2);
  return a(0);
}
只有通过值捕获对象时,才会进行复制

编辑:使用您发布的代码,尝试将有问题的行更改为

TConstIterator pIt = std::find_if(rtContainer.begin(), rtContainer.end(), 
  boost::bind(&TValueType::bSameSocket, boost::cref(rtData), _1));
                                        ^^^^^^^^^^^

这将使它变得更好;如果没有,请报告。

能否显示boost::bind导致新建/删除的代码?也许,您通过值绑定某个对象,而它的复制构造函数执行某些内部数据的深度复制?Igor,代码是非常模板化的,尝试提取它的合理版本需要很长时间。我已经通过一个(讨厌的)成员函数指针将绑定替换为直接调用,并且它不会命中new和delete。我认为这是动态地更新和删除函数对象。通过创建和销毁,您不意味着新建和删除吗?如果我运行bind 10000次并点击break,那么我总是使用new、delete、malloc或free函数。调用堆栈直接返回绑定。我将代码替换为成员函数指针,现在运行速度快了数千倍。好的,
bind
可以在其内部实现中使用
new
delete
。但您询问bind是否复制了该函数,而实际上它并没有复制该函数。jpalecek,见下文。我将绑定更改为一个成员函数指针调用,然后新的/删除调用就消失了。我想知道区别是否在于我绑定到了一个成员函数?@Ant:不,请看我链接的代码片段。它们绑定到一个成员函数。我相信当您将代码更改为纯函数调用时,分配没有发生;我只是假设这些调用不是由于
bind
本身,而是由于可以通过引用传递的参数,但是在bind的情况下是通过值传递的。如果你想了解更多,请向我们展示真实的代码。我认为这足以说明我在做什么。导致新建/删除问题的代码将被注释掉并替换为下面的代码。@Ant:请参阅编辑;我只是有点困惑,在下面的
vMoveIf
函数中有类似的代码。你已经试过了吗?非常感谢你完全正确,我的代码更改解决了这个问题并隐藏了它。将代码更改为boost::cref(rtData)也会使代码速度加快。因此,它正在复制导致新建和删除的参数。我学到了很多!
TConstIterator pIt = std::find_if(rtContainer.begin(), rtContainer.end(), 
  boost::bind(&TValueType::bSameSocket, boost::cref(rtData), _1));
                                        ^^^^^^^^^^^