虚拟方法与std ::功能成员变量在性能方面
Virtual method VS std::function member variable in terms of performance
游戏引擎具有此类:
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作为内衬函数。从理论上讲,它不应比常规虚拟函数慢。另一方面,如果函数对象获得了不可限制的可呼叫,例如功能指针,则可能使用两个间接方向来启动该函数。这可能比常规虚拟呼叫慢。这取决于。
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- CUDA 的性能取决于声明变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- std::原子与非原子变量的性能如何?
- 静态常量与常量局部变量,哪一个性能更好
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 使用'this->'成员变量访问的性能
- 虚拟方法与std ::功能成员变量在性能方面
- 误报警告 PVS 工作室:V821 性能降低。'rhs'变量可以在较低级别的范围内构造
- 将中间变量用于三元运算符(或类似运算符)以获得更好的性能
- 变量会影响性能吗
- 使用布尔变量的运算符"=="的性能?
- 与表达式或变量进行比较之间的性能差异
- 全局变量的顺序会改变C /OpenGL的性能
- 静态、常量和全局变量带来的性能提升
- 局部变量与指针性能
- 性能对象属性与范围变量
- 之前声明所有局部变量是否有性能提升或其他原因
- 变量名称的长度是否会造成任何与性能或效率相关的问题
- c++局部与成员变量性能