ami*_*reh 11 c++ optimization pointers conditional-statements
在重型循环中,例如在游戏应用程序中发现的循环,可能有许多因素决定循环体的哪个部分被执行(例如,角色对象将根据其当前状态进行不同的更新),因此而不是:
void my_loop_function(int dt) {
if (conditionX && conditionY)
doFoo();
else
doBar();
...
}
Run Code Online (Sandbox Code Playgroud)
我习惯使用一个函数指针,该函数指针指向与角色当前状态相对应的某个逻辑函数,如:
void (*updater)(int);
void something_happens() {
updater = &doFoo;
}
void something_else_happens() {
updater = &doBar;
}
void my_loop_function(int dt) {
(*updater)(dt);
...
}
Run Code Online (Sandbox Code Playgroud)
在我不想做任何事情的情况下,我定义了一个虚拟函数,并在需要时指向它:
void do_nothing(int dt) { }
Run Code Online (Sandbox Code Playgroud)
现在我真正想知道的是:我是不是在不知不觉地迷恋这个?上面给出的例子当然很简单; 有时候我需要检查很多变量来弄清楚我需要执行哪些代码,所以我想出使用这些"状态"函数指针确实会更优,对我来说,自然,但有些人我与之打交道是非常不同意的.
那么,使用(虚拟)函数指针值得它的收益,而不是用条件语句填充我的循环来流动逻辑?
编辑:为了阐明如何设置指针,它是通过基于每个对象的事件处理完成的.当一个事件发生时,比如说该字符附加了自定义逻辑时,它会在该事件处理程序中设置updater指针,直到另一个事件发生,这将再次改变流程.
谢谢
函数指针方法让你使转换异步.而不仅仅是传递dt给updater,也传递对象.现在更新程序本身可以负责状态转换.这使得状态转换逻辑本地化,而不是在一个大的丑陋if ... else if ... else if ...函数中将其全局化.
至于这个间接的成本,你关心吗?您可能会关心更新程序是否非常小,以至于取消引用和函数调用的成本超过了执行更新程序代码的成本.如果更新程序具有任何复杂性,那么这种复杂性将压倒这种增加的灵活性的成本.