【发布时间】:2012-12-27 16:59:03
【问题描述】:
库代码:
class Resource
{
public:
typedef void (*func_sig)(int, char, double, void*);
//Registration
registerCallback(void* app_obj, func_sig func)
{
_app_obj = app_obj;
_func = func;
}
//Calling when the time comes
void call_app_code()
{
_func(231,'a',432.4234,app_obj);
}
//Other useful methods
private:
void* app_obj;
func_sig _func;
//Other members
};
申请代码:
class App
{
public:
void callme(int, char, double);
//other functions, members;
};
void callHelper(int i, char c, double d, void* app_obj)
{
static_cast<App*>(app_obj)->callme(i,c,d);
}
int main()
{
App a;
Resource r;
r.registercallback(&a, callHelper);
//Do something
}
以上是回调机制的最小实现。它更冗长,不支持绑定、占位符等,例如 std::function。
如果我对上述用例使用std::function 或boost::function,会不会有任何性能缺陷?此回调将处于实时应用程序的非常关键的路径中。我听说 boost::function 使用虚函数来进行实际的调度。如果不涉及绑定/占位符,那会被优化吗?
更新
对于那些有兴趣在最新编译器中检查程序集的人:https://gcc.godbolt.org/z/-6mQvt
【问题讨论】:
-
为什么不试试做一些基准测试呢?
-
我相信 std::function 如何实现类型擦除取决于实现(我认为微软使用虚函数),因此答案甚至可能取决于您的目标平台。如果我是你,我会尝试一些基准测试
-
我同意基准测试会显示。我想知道 std::function 在理论上是否有可能专门化这种情况并像普通函数 ptr 一样高效。
-
@balki:就像 std::string 的“SSO”一样,std::function 也有可能进行 SFO(小型函子优化)。这将避免动态内存分配并加速复制 std::function 对象。如果您关心调用开销,则不应使用 std::function 或函数指针,而应尝试直接使用仿函数。这将启用内联。无论如何,测试一下。您可能还想检查您的 C++ 供应商是否为 std::function 执行 SFO。
标签: c++ c++11 boost-function std-function