1

Boost::bind 文档状态:

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

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

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

所以我的问题是有没有一种方法可以绑定到成员函数并避免新建和删除?

4

3 回答 3

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);
}

我尝试破解operator newgdb 中的变体,但没有触发。所以我怀疑你的问题实际上boost::bind是复制绑定参数(比较这两个 片段的输出)或调用参数。在这些中搜索可以在复制时分配内存的东西,并尝试摆脱它。

如果您使用的是 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));
                                        ^^^^^^^^^^^

那应该会更好;如果没有,请报告。

于 2012-07-06T10:55:00.250 回答
1

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

于 2012-07-05T09:49:32.453 回答
0

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

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

我通过迭代列表自己通过成员函数指针调用成员函数来解决 boost::bind 问题。

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

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

于 2012-07-06T10:26:23.820 回答