gpt4 book ai didi

C++ 虚拟方法,不需要 "this"指针 - 优化

转载 作者:行者123 更新时间:2023-11-28 01:46:17 26 4
gpt4 key购买 nike

我想实现对某个类的访问:

class A { some properties and methods };

问题是 A 可以处于多个状态,并且方法需要相应地运行。一种方法是这样的:

class A
{
void Method1() {
if (A is in state 1) { do something }
else if (A is in state 2) { do something else }
...
}
};

如果多次调用这些方法,那显然不是最佳选择。因此,一个易于实现的解决方案是为不同的状态创建多个类:

class A
{
class State1 {
virtual void Method1(A& a) { do something; }
...
} State1Instance;

class State2 { ... }
...
};

然后根据当前状态(例如 State1Instance)管理指向对象的指针并调用该对象的方法。这避免了 CPU 消耗情况。

但是 State# 方法还接收完全无用的“this”指针,指向 State 对象。有没有办法避免这种情况?我知道差异很小,但我正在努力使其尽可能最佳,并且使用 CPU 寄存器来获取完全没有意义的值并不理想。这实际上是“虚拟静态”的一个很好的用途,但是这是被禁止的。

最佳答案

如果您真的很在意重复的分支,只需使用良好的旧函数指针即可,而通常您不应该这样做。

struct A
{
using StateFn = void (*)(A&);

static void State1(A& a) { a.i = 42; }
static void State2(A& a) { a.i = 420; }

void Method1() { s(*this); }

StateFn s = State1;
int i;
};

如果您有多个方法与每个状态相关联,则可以这样构造一个方法表

struct A
{
static void State1M1(A& a) { a.i = 42; }
static void State2M1(A& a) { a.i = 420; }

static int State1M2(A& a) { return a.i * 42; }
static int State2M2(A& a) { return a.i * 420; }

// The naming sucks, you should find something better

static constexpr struct {
void (*Method1)(A&);
int (*Method2)(A&);
} State[] = {{State1M1, State1M2}, {State2M1, State2M2}};

void Method1() { State[s].Method1(*this); }
int Method2() { return State[s].Method2(*this); }

int s, i;
};

我很好奇这是否是对 switch 语句的加速,在采用它之前进行基准测试。当您像第二种情况一样开始构建方法表时,您实际上并没有以一种相当未优化的方式做与多态性有太大不同的事情。

关于C++ 虚拟方法,不需要 "this"指针 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44953545/

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