c++ - 不可能的快速委托是 std::function 的合适替代方案吗?
问题描述
我最近看到一篇名为“The impossibly fast c++ delegates”的文章,它的 c++11 版本名为“The impossibly fast c++ delegates fixed”,看起来很受欢迎。似乎它们与 std::function 具有相同的用例,即将不同的仿函数类型强制为单一类型。然而,作者声称它们的性能要高得多。
它们是 std::function 的合适的、高性能的替代品吗?如果是这样,为什么 std::function 不以相同的方式实现?或者不可能快的 C++ 委托有什么缺点吗?
编辑:正如评论所要求的,“不可能的快速 C++ 委托”的主要思想似乎是将指向无类型数据的指针与函数指针一起存储,该函数指针将指向无类型数据的指针作为参数。“修复的不可能快的 c++ 委托”扩展了以前的功能以支持 lambdas 等。这是“不可能的快速 C++ 委托”中显示的代码摘要
class delegate
{
public:
delegate()
: object_ptr(0)
, stub_ptr(0)
{}
template <class T, void (T::*TMethod)(int)>
static delegate from_method(T* object_ptr)
{
delegate d;
d.object_ptr = object_ptr;
d.stub_ptr = &method_stub<T, TMethod>; // #1
return d;
}
void operator()(int a1) const
{
return (*stub_ptr)(object_ptr, a1);
}
private:
typedef void (*stub_type)(void* object_ptr, int);
void* object_ptr;
stub_type stub_ptr;
template <class T, void (T::*TMethod)(int)>
static void method_stub(void* object_ptr, int a1)
{
T* p = static_cast<T*>(object_ptr);
return (p->*TMethod)(a1); // #2
}
};
以下是两篇文章的链接: https ://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates
https://www.codeproject.com/Articles/1170503/The-Impossibly-Fast-Cplusplus-Delegates-Fixed
解决方案
难以置信的快速 C++ 代表有什么缺点吗?
仅提供样品手柄:
- 固定签名
void(int)
(可以很容易地用模板固定) - 方法指针(及其类)(因此没有直接的 lambda/functor,没有常规函数指针)。
lambda/Functor 可以很容易地与它们的operator()
. 不确定处理函数指针的可能开销。
提供的样本不处理:
- 所有权。
这是两种实现之间的主要区别,并且增加了开销(与无所有权相比,在创建和执行时)
注意:还有其他“function_view”
它们是合适的、高性能的替代品
std::function
吗?
如果你不需要所有权,是的。
如果是这样,为什么不
std::function
以相同的方式实施?
std::function
应该处理所有权。
推荐阅读
- tensorflow - 大型可训练嵌入层减慢了训练速度
- sql-server - 如何提交 T-SQL 脚本
- ios - 当应用程序在推送通知iOS Swift中终止时如何调用API?
- wso2 - 是否不再支持使用 ESB 集群的管理节点?
- c# - 在EF中保存父实体时,子实体是否也保留在实体框架中?
- angular - 在 Jasmine 单元测试中:无法解析 TestFormInputComponentBase 的所有参数
- jquery - jquery函数重叠
- java - Android ScrollView 从子 WebView 窃取触摸事件
- php - 如何检查 $_POST ['input'] 是否仅包含允许的字符
- java - 异常:java.lang.NullPointerException on connection to the orient graph Database