【发布时间】:2017-05-03 16:28:46
【问题描述】:
游戏引擎有这个类:
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 函数被调用(其中 thiz = 鼠标侦听器)。 知道该类是从外部库(静态链接)中使用的,这在性能方面更好吗?
注意:除非收到鼠标事件,否则不会调用这些函数,当发生这种情况时,会为每个侦听鼠标输入的对象调用适当的函数(不应该是很多,
【问题讨论】:
-
"我摆脱了调用虚函数的开销" false;您实际上添加了至少一个间接步骤。
std::function在内部也是用虚函数实现的。编译器必须从隐藏在std::function中的指针中提取vtable 并对其进行间接调用,而不是检索您的类vtable 槽并进行间接调用。作为一个额外的缺点,std::function是一个非常复杂的野兽,我从未见过编译器对其进行任何去虚拟化,而在许多情况下它是在“常规”虚拟函数上完成的。 -
“我摆脱了开销” 如此大胆的声明不能不进行 profiling,你之前和之后都对你的代码进行了 profile 吗?
-
不,源代码很大,我还没有改变任何东西,我需要先知道一些答案
-
坚持虚拟
-
那是一年前的事,我确实运行了引擎的分析器,发现 std::function 更好,因为它避免了额外的调用
标签: c++ performance inheritance lambda virtual-functions