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


Boost::

bind 文档状态:

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

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

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

所以我的问题有没有办法绑定到成员函数并避免新的和删除?

根据我的实验(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正在复制绑定参数(比较这两个片段的输出)或调用参数。在其中搜索可以在复制时分配内存的内容,并尝试摆脱它。

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

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

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

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

我的问题是:有没有办法绑定到成员函数并避免新的和删除?

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

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

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

最新更新