首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bind::bind创建成员函数的副本

bind::bind创建成员函数的副本
EN

Stack Overflow用户
提问于 2012-07-05 09:45:41
回答 3查看 868关注 0票数 1

bind文档状态:

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

当我使用一个指向成员函数的指针时,我在代码中看到过多的消息和删除。我不清楚这些文档是否是boost::bind(&classname::functionname,.)制作函数的副本。

或者这个问题没有任何意义,当它将一个成员函数转换成一个函数对象时,它显然必须对函数对象进行新的处理。

那么,我的问题是,有什么方法可以绑定到成员函数并避免新的和删除的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-06 10:55:00

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

代码语言:javascript
复制
#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函数。该示例将被转换为

代码语言:javascript
复制
auto a = [&](int a1) { return f(a1, 2); }

只有当您按值捕获对象时,才会进行复制。

编辑:使用您发布的代码,尝试将所讨论的行更改为

代码语言:javascript
复制
TConstIterator pIt = std::find_if(rtContainer.begin(), rtContainer.end(), 
  boost::bind(&TValueType::bSameSocket, boost::cref(rtData), _1));
                                        ^^^^^^^^^^^

这应该会使它变得更好,否则就报告吧。

票数 1
EN

Stack Overflow用户

发布于 2012-07-05 09:49:32

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-06 10:26:23

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

我的问题是:有什么方法可以绑定到成员函数并避免新的和删除的吗?

我通过迭代列表来完成boost::bind的工作,通过一个成员函数指针调用一个成员函数。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11341750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档