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.
当然它会导致开销.它的作用是创建一个存储绑定参数的仿函数,并operator()使用其余参数调用.现在,这是重要的吗?我不知道,因为那只是一个字.提出1000万个请求并进行衡量.您是唯一可以判断此开销是否对您有意义的人.
此外,我遇到了类似的问题.因为我不需要委托,所以我可以使用函数指针.但是我找到了一个有趣的基准,它也提到了一些替代实现,所有这些都具有更好的性能boost::function.这是以可移植性为代价的,在某些情况下是实现中的丑陋,非标准的黑客攻击(但是回报非常好).
boost::bind生成一个功能对象,如果它被用作函数模板的参数,可以进行优化,但是会boost::function阻止这种优化,就像将指针传递给函数一样会阻止它的内联.boost::function本身不需要引入比虚函数更多的开销或通过指向函数的指针调用.
PS.我同意TamásSzelei:提出1000万个请求并进行衡量.