gpt4 book ai didi

c++ - 指针取消引用开销与分支/条件语句

转载 作者:可可西里 更新时间:2023-11-01 15:12:59 26 4
gpt4 key购买 nike

在繁重的循环中,例如在游戏应用程序中发现的循环,可能有很多因素决定执行循环体的哪一部分(例如,角色对象将根据其当前状态进行不同的更新),因此取而代之的是做的:

void my_loop_function(int dt) {
if (conditionX && conditionY)
doFoo();
else
doBar();

...
}

我习惯使用一个函数指针,指向对应角色当前状态的某个逻辑函数,如:

void (*updater)(int);

void something_happens() {
updater = &doFoo;
}
void something_else_happens() {
updater = &doBar;
}
void my_loop_function(int dt) {
(*updater)(dt);

...
}

在我不想做任何事情的情况下,我定义了一个虚拟函数并在需要时指向它:

void do_nothing(int dt) { }

现在我真正想知道的是:我是否不必要地沉迷于此?上面给出的例子当然很简单;有时我需要检查许多变量以确定我需要执行哪些代码片段,所以我发现使用这些“状态”函数指针确实是更优化的,对我来说,自然,但有几个人我'处理严重不同意。

那么,使用(虚拟)函数指针而不是用条件语句填充我的循环来流动逻辑是否值得?

编辑:为了阐明指针的设置方式,它是通过基于每个对象的事件处理来完成的。当一个事件发生时,比如说,该角色附加了自定义逻辑,它会在该事件处理程序中设置更新指针,直到另一个事件发生,这将再次改变流程。

谢谢

最佳答案

函数指针方法让您可以异步进行转换。不仅要将 dt 传递给 updater,还要传递对象。现在更新器可以自己负责状态转换。这将状态转换逻辑本地化,而不是在一个丑陋的大if ... else if ... else if ... 函数中将其全局化。

至于这种间接的成本,你关心吗?您可能会关心您的更新程序是否非常小,以至于取消引用加上函数调用的成本超过了执行更新程序代码的成本。如果更新程序有任何复杂性,那么这种复杂性将压倒这种增加灵 active 的成本。

关于c++ - 指针取消引用开销与分支/条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7467343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com