查找表到函数指针数组C ++的性能

时间:2016-04-27 13:36:30

标签: c++ virtual-machine emulation machine-language opcodes

我有以下代码来模拟我的电脑上的基本系统(x86):

typedef void (*op_fn) ();

void add()
{
   //add Opcode
   //fetch next opcode
   opcodes[opcode]();
}

void nop()
{
   //NOP opcode
   //fetch next opcode
   opcodes[opcode]();
}

const op_fn opcodes[256] =
{
    add,
    nop,
    etc...
};

我通过opcodes[opcode]()称这个“表” 我正在努力提高口译员的表现。 如何内联每个函数,比如

inline void add()
inline void nop()

这样做有什么好处吗?

有没有让它变得更快? 感谢

3 个答案:

答案 0 :(得分:3)

仅仅因为您将方法标记为inline,它不需要编译器这样做 - 它更多的是提示而不是订单。

鉴于您将操作码处理程序存储在数组中,编译器需要将函数的地址放入数组中,因此无法内联它。

你的方法实际上并没有错。如果您确实认为自己遇到了性能问题,那就获取一些指标,否则不要担心(此时!)。函数指针表的概念并不新鲜 - 它实际上是C ++如何实现虚函数(即vtable)。

答案 1 :(得分:2)

“内联”表示“不发出函数调用;而是在编译时替换函数体。”

通过函数指针调用意味着“执行函数调用,其细节在运行时才会知道。”

这两个特征从根本上是对立的。 (你可能希望的最好的是,一个足够先进的编译器可以静态地确定在非常有限的情况下通过函数指针调用哪个函数并内联那些函数。)

switch块通常实现为跳转表,它可以比函数调用具有更少的开销,因此用switch块替换函数指针数组并使用内联可能会有所不同。

答案 2 :(得分:1)

inline只是对您的编译器的一个提示,它不保证任何内联完成。你应该阅读内联(也许是at the ISO C++ FAQ),因为过多的内联实际上会使你的代码更慢(通过代码膨胀和相关的虚拟内存垃圾)。