首页 > 解决方案 > 不可能的快速委托是 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++performancedelegatescompare

解决方案


难以置信的快速 C++ 代表有什么缺点吗?

仅提供样品手柄:

  • 固定签名void(int)(可以很容易地用模板固定)
  • 方法指针(及其类)(因此没有直接的 lambda/functor,没有常规函数指针)。

lambda/Functor 可以很容易地与它们的operator(). 不确定处理函数指针的可能开销。

提供的样本不处理:

  • 所有权

这是两种实现之间的主要区别,并且增加了开销(与无所有权相比,在创建和执行时)

注意:还有其他“function_view”

它们是合适的、高性能的替代品std::function吗?

如果你不需要所有权,是的。

如果是这样,为什么不std::function以相同的方式实施?

std::function应该处理所有权。


推荐阅读