boost :: bind会导致开销吗?

ere*_*eOn 5 c++ boost bind overhead

我目前正在研究网络软件.它有一个主类,server显然代表一个服务器实例.

一个server实例可以发送请求,并通知用户通过回调的响应.

代码如下:

class server
{
  public:
    typedef boost::function<void (int duration)> callback_func;

    void send_request(endpoint& ep, callback_func cb);
};
Run Code Online (Sandbox Code Playgroud)

现在让我们说,作为一个用户,我希望回调知道调用它的实例,我可以做以下事情:

void mycallback(const server& sv, int duration) { ... }

server sv;
sv.send_request("localhost", boost::bind(&mycallback, boost::ref(sv), _1));
Run Code Online (Sandbox Code Playgroud)

但我想知道:这有什么开销吗?这些电话mycallback会比使用"常规"电话慢吗?

谢谢.

脚注:我当然可以将我typedef改为:typedef boost::function<void (const server& sv, int duration)> callback_func;如果boost::bind造成任何重大开销,那可能就是我最终会做的.我想知道成本意味着使用什么boost::bind.

Tam*_*lei 5

当然它会导致开销.它的作用是创建一个存储绑定参数的仿函数,并operator()使用其余参数调用.现在,这是重要的吗?我不知道,因为那只是一个字.提出1000万个请求并进行衡量.您是唯一可以判断此开销是否对您有意义的人.

此外,我遇到了类似的问题.因为我不需要委托,所以我可以使用函数指针.但是我找到了一个有趣的基准,它也提到了一些替代实现,所有这些都具有更好的性能boost::function.这是以可移植性为代价的,在某些情况下是实现中的丑陋,非标准的黑客攻击(但是回报非常好).

  • Boost v1.36.0(2008年发布)为`boost :: function`引入了一个小对象优化,使得引用的基准测试结果(从2007年开始)无效. (3认同)

Beg*_*oth 5

boost::bind生成一个功能对象,如果它被用作函数模板的参数,可以进行优化,但是会boost::function阻止这种优化,就像将指针传递给函数一样会阻止它的内联.boost::function本身不需要引入比虚函数更多的开销或通过指向函数的指针调用.

PS.我同意TamásSzelei:提出1000万个请求并进行衡量.