boost :: bind是否为成员函数的副本

时间:2012-07-05 09:45:42

标签: boost bind member-function-pointers

Boost :: bind文档说明:

  

默认情况下,bind会复制提供的函数对象。 boost :: ref和boost :: cref可用于存储对函数对象的引用,而不是副本。

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

或者这个问题没有意义,因为它将成员函数转换为函数对象,显然必须新建函数对象。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据我的实验(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);
}

我试过打破gdb中的operator new个变种并且它没有触发。所以我怀疑你的问题实际上是boost::bind正在复制绑定的参数(比较这些two snippets的输出)或调用参数。搜索可以在复制时分配内存的内容,并试图摆脱它。

如果您正在使用C ++ 11编译器,则可以完全使用boost::bind并使用lambda函数代替。该示例将转换为

auto a = [&](int a1) { return f(a1, 2); }

只有按值捕获对象时才会复制。

编辑:使用您发布的代码,尝试将相关行更改为

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

这应该会让它变得更好;报告,如果没有。

答案 2 :(得分:0)

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

我的问题是:有没有办法可以绑定到成员函数并避免使用new和delete?

我通过遍历列表来解决boost :: bind,我自己通过成员函数指针调用成员函数。

成员指针函数的类型是从列表的模板参数及其存储的数据类型派生的,但是无论模板是否模板化,相同的技术都有效。

此解决方案将用户对特定操作的响应感知从5分钟降低到有效。