gpt4 book ai didi

c++ - 在类中声明函数数组

转载 作者:行者123 更新时间:2023-12-05 09:31:45 25 4
gpt4 key购买 nike

我在一个类中有一批函数:

class Edges // Edges of a Rubik's cube
{
// Stuff

protected:
// Edges movements
void e_U();
void e_D();
void e_F();
void e_B();
void e_R();
void e_L();

// More stuff
};

一个新类继承了这个函数:

class Cube: public Edges // Rubik's cube class
{
public:
void U(int); // U slice edges movement relative to spin

// Stuff
}

所需函数的调用取决于一个数字,如您在下一段代码中所见:

void Cube::U(int spin) // U slice movement for the given spin
{
switch (spin)
{
case 0: e_U(); return;
case 1: e_U(); return;
case 2: e_U(); return;
case 3: e_U(); return;
case 4: e_D(); return;
...
case 23: e_L(); return;
default: return;
}
}

我想提高性能,所以我把函数放在一个数组中:

class Cube: public Edges // Rubik's cube class
{
public:
void U(int); // U slice edges movement relative to spin

// Stuff

private:

const static void (*(USlice[24]))(); // U slice edges movement relative to spin

// More stuff
}

const void Cube::( (*(USlice[24]))() ) =
{
e_U, e_U, e_U, e_U,
e_D, e_D, e_D, e_D,
e_F, e_F, e_F, e_F,
e_B, e_B, e_B, e_B,
e_R, e_R, e_R, e_R,
e_L, e_L, e_L, e_L
};

所以 U 函数现在应该是这样的:

void Cube::U(int spin) // U slice movement for the given spin
{
USlice[spin]();
}

我的问题是我找不到在类中声明函数数组的正确方法。我已经尝试了所有我能想到的方法(删除“const”和“static”语句,公开所有内容,...)

数组应该是“static”和“const”,成员是24个没有参数的“void”函数。

实际上我不知道在数组中声明函数是否比使用 switch 语句更快,但我想检查一下。

谢谢。

最佳答案

实际上,仅出于性能考虑,您不需要使用函数指针数组。

没有速度差异。
使用函数指针,在asm中需要1次MOV操作(约2个DWORD),而使用switch需要1~2次CMP或TEST操作(约2-6个WORD,因为24sets中只有6个唯一函数)。

你提到的错误是,数组的值是指向 protected 成员函数的函数指针 - 而不是全局函数。
这意味着,您必须考虑第一个函数参数是 *this,它对 C++ 代码是不可见的。

关于c++ - 在类中声明函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68666087/

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