虚拟方法与std ::功能成员变量在性能方面

Virtual method VS std::function member variable in terms of performance

本文关键字:变量 性能 方面 成员 功能 方法 std 虚拟      更新时间:2023-10-16

游戏引擎具有此类:

class  MouseListener{
public :
MouseListener();
virtual void OnMouseDown(int mx,int my);
virtual void OnMouseUp(int mx,int my);
.
.
.
};

每个想要收听鼠标输入的对象,必须固有该类并覆盖其方法。为了每次不必声明新类型,该类都会修改为:

class  MouseListener{
public :
MouseListener();
std::function <void(MouseListener*,int,int)>OnMouseDown;
std::function <void(MouseListener*,int,int)>OnMouseUp;
.
.
.
};

现在可以使用类:

MouseListener * m = new MouseListener();
m->OnMouseDown = [](MouseListener * thiz,int x,int y){
   //// do something
};

从输入系统中,只能调用未null(分配)的MouseListener的功能(带有鼠标=鼠标侦听器)。知道该类是从外部库(静态链接)中使用的,在性能方面更好?

注意:除非收到鼠标事件,否则这些函数都不会被调用/strong>

它确实取决于虚拟函数与函数对象的用法。

尽管std::function May 比虚拟调用*慢,但std::function具有短缓冲区优化,这可能会阻止动态内存分配(您可能在虚拟版本中可能具有它)。

这本身可能胜过您对常规多态性所做的任何事情。

内部(但不能保证),std::function对象无论如何都会使用虚拟调用来擦除类型,所以我想说差异可以忽略不计。

提示 - 确保检查std::function是否有效(通过调用if(static_cast<bool>(myFunction)))。编译器将插入检查以查看功能是否为空。如果没有,该程序将投掷std::bad_function_call。开发人员的检查将使编译器删除其支票,并在打开优化时与std::bad_function_call相关的代码,并留下很多"更光滑"的汇编代码。

在我的经验中处理性能和C 时,优化出门内存分配,线程间引发和不良数据结构,这些结构与缓存不利。通常,它比优化CPU-STUFF(例如虚拟功能与std::function

更值得优化。

*一个像样的编译器可以将类型的擦除作为虚拟函数 给定的lambda作为内衬函数。从理论上讲,它不应比常规虚拟函数慢。另一方面,如果函数对象获得了不可限制的可呼叫,例如功能指针,则可能使用两个间接方向来启动该函数。这可能比常规虚拟呼叫慢。这取决于。