在C++;我可以使用函数指针表来跳转(而不是调用)函数吗? 在C++中,我可以使用函数指针表来跳转(不调用)函数吗?我知道如何创建和调用跳转表,但我正在构建一个扫描程序,希望在例程之间高效地跳转,因此我想进行跳转,以便将相同的堆栈帧用于目标例程。我将使配置文件相同。

在C++;我可以使用函数指针表来跳转(而不是调用)函数吗? 在C++中,我可以使用函数指针表来跳转(不调用)函数吗?我知道如何创建和调用跳转表,但我正在构建一个扫描程序,希望在例程之间高效地跳转,因此我想进行跳转,以便将相同的堆栈帧用于目标例程。我将使配置文件相同。,c++,C++,不,您不能,但有一种众所周知的模式可以避免在重复查找过程中堆积堆栈帧:连续蹦床样式 与此相反: void scanner1( ... ) { fn_table[next](); } 这样做: int scanner2( ... ) { return next; } while ((next = fn_table[next]()) != END) {} 因为在每次调用之前都有一个返回,所以堆栈深度不会增加 另一个好处是,如果要添加对访问状态的跟踪,可以在单个点(蹦床处理循

不,您不能,但有一种众所周知的模式可以避免在重复查找过程中堆积堆栈帧:连续蹦床样式

与此相反:

void scanner1( ... )
{
     fn_table[next]();
}
这样做:

int scanner2( ... )
{
     return next;
}

while ((next = fn_table[next]()) != END) {}
因为在每次调用之前都有一个返回,所以堆栈深度不会增加

另一个好处是,如果要添加对访问状态的跟踪,可以在单个点(蹦床处理循环内)进行,而不是分散在所有扫描仪功能中

如果有状态要传递给下一个处理程序,但传递的次数不多,则会变得更复杂(例如,使用输出参数而不是返回值,或者返回指向functor对象的智能指针,例如,
std::function
,该函数具有预绑定的参数)


这也包括在内。

如果您必须在同一帧中的两段代码之间跳转,那么首先为什么要调用它们函数呢?如果您的函数足够简单,那么让编译器来处理优化。当应用时,它足够聪明,省略了堆栈帧。@ Dyz:函数指针是唯一的(可移植的)在C++中识别代码的方式。@ MaMAX:间接调用(通过函数指针)通常足以击败优化。:gcc已经计算了goto并允许您获取标签的地址,但这是完全非标准的,并且会导致一个非常大的函数。