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);