1

我有以下代码来模拟我的电脑(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()

这样做有什么好处吗?

反正有没有让它跑得更快?谢谢

4

3 回答 3

3

仅仅因为您标记了一个方法,因为inline它不需要编译器这样做 - 它更像是一个提示而不是一个命令。

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

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

于 2016-04-27T13:57:03.450 回答
2

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

通过函数指针调用意味着“进行函数调用,其细节要到运行时才能知道”。

这两个特点是根本对立的。(您可以期望的最好的结果是,足够先进的编译器可以在非常有限的情况下静态确定通过函数指针调用哪个函数并内联这些函数。)

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

于 2016-04-27T13:50:50.907 回答
1

inline只是对您的编译器的提示,它不保证执行任何内联。您应该阅读内联(可能在 ISO C++ FAQ中),因为过多的内联实际上会使您的代码变慢(通过代码膨胀和相关的虚拟内存垃圾)。

于 2016-04-27T13:55:33.677 回答