C++ 在C++;

C++ 在C++;,c++,performance,caching,virtual-functions,C++,Performance,Caching,Virtual Functions,是否有办法缓存虚拟函数调用。虚拟函数调用可能不是性能瓶颈。但是作为一个思想实验,如果我们“缓存”虚拟函数调用,它会提高性能还是让性能变得更糟 class B { public: virtual int func(int a) = 0; }; class D1 : public B { public: int func(int a) { return 0; } }; typedef std::function<int(int)> fu

是否有办法缓存虚拟函数调用。虚拟函数调用可能不是性能瓶颈。但是作为一个思想实验,如果我们“缓存”虚拟函数调用,它会提高性能还是让性能变得更糟

class B {
public:
    virtual int func(int a) = 0;
};

class D1 : public B {
public:
    int func(int a)
    {
        return 0;
    }
};

typedef std::function<int(int)> func_type;
func_type  gv;

template <typename T>
void addFuncCache(B *b)
{
    func_type f = [=] (int a) ->int {
        return static_cast<T *>(b)->T::func(a);
    };

    gv = f;
}

int main()
{
    D1 d1;

    addFuncCache<D1>(&d1);
    gv(10);   
}
快于

B *bp = &d1; bp->func(10);

还是更糟。

好吧,你可以找时间看看。你什么也没做。
std::function
调用无论如何都需要在幕后进行间接调用(或虚拟调用)。此外,“it是否会改善/恶化绩效”的答案是:衡量。我看不出这会更快。完全启用
void*
int(*)(void*,int)
样式类型擦除,带有
final
非派生类。但即使这样,也会妨碍编译器的优化,特别是当您引入全局状态时。在实践中,我认为这不是一个好主意。当你“缓存一个虚拟函数”时,你到底在缓存什么?在某些情况下,编译器可以对虚拟函数调用进行设备化。好吧,你可以对它进行计时以找出答案。你什么也没得到。
std::function
调用无论如何都需要在幕后进行间接调用(或虚拟调用)。此外,“it是否会改善/恶化绩效”的答案是:衡量。我看不出这会更快。完全启用
void*
int(*)(void*,int)
样式类型擦除,带有
final
非派生类。但即使这样,也会妨碍编译器的优化,特别是当您引入全局状态时。实际上,我认为这不是一个好主意。当你“缓存一个虚拟函数”时,你到底在缓存什么?在某些情况下,编译器可以对虚拟函数调用进行设备化。
B *bp = &d1; bp->func(10);