查找 table 函数指针数组 C++ 性能
Lookup table to Function Pointer Array C++ performance
我有以下代码在我的电脑 (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]()
称其为 "table"
我正在努力提高口译员的表现。
内联每个函数怎么样,比如
inline void add()
inline void nop()
这样做有什么好处吗?
有没有办法让它运行得更快?
谢谢
"Inline"表示"don't emit a function call; instead, substitute the function body at compile time."
通过函数指针调用意味着"do a function call, the details of which won't be known until runtime."
这两个特点是根本对立的。 (您最好的希望是足够先进的编译器可以在非常有限的情况下静态确定通过函数指针调用哪个函数并将其内联。)
switch
块通常实现为跳转表,其开销可能比函数调用少,因此用 switch
块替换函数指针数组并使用内联可能会有所不同。
inline
只是对您的编译器的提示,它不保证任何内联都已完成。您应该仔细阅读内联(也许 at the ISO C++ FAQ),因为过多的内联实际上会使您的代码 变慢(通过代码膨胀和相关的虚拟内存垃圾处理)。
仅仅因为您将一个方法标记为 inline
,它不需要编译器这样做 - 它更多的是提示而不是命令。
鉴于您将操作码处理程序存储在一个数组中,编译器需要将函数的地址放入数组中,因此它无法内联它。
其实你的做法没有任何问题。如果你真的认为你有性能问题,那么获取一些指标,否则不要担心(此时!)。 table 函数指针的概念并不是什么新鲜事——它实际上是 C++ 实现虚函数的方式(即 vtable)。
我有以下代码在我的电脑 (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]()
称其为 "table"
我正在努力提高口译员的表现。
内联每个函数怎么样,比如
inline void add()
inline void nop()
这样做有什么好处吗?
有没有办法让它运行得更快? 谢谢
"Inline"表示"don't emit a function call; instead, substitute the function body at compile time."
通过函数指针调用意味着"do a function call, the details of which won't be known until runtime."
这两个特点是根本对立的。 (您最好的希望是足够先进的编译器可以在非常有限的情况下静态确定通过函数指针调用哪个函数并将其内联。)
switch
块通常实现为跳转表,其开销可能比函数调用少,因此用 switch
块替换函数指针数组并使用内联可能会有所不同。
inline
只是对您的编译器的提示,它不保证任何内联都已完成。您应该仔细阅读内联(也许 at the ISO C++ FAQ),因为过多的内联实际上会使您的代码 变慢(通过代码膨胀和相关的虚拟内存垃圾处理)。
仅仅因为您将一个方法标记为 inline
,它不需要编译器这样做 - 它更多的是提示而不是命令。
鉴于您将操作码处理程序存储在一个数组中,编译器需要将函数的地址放入数组中,因此它无法内联它。
其实你的做法没有任何问题。如果你真的认为你有性能问题,那么获取一些指标,否则不要担心(此时!)。 table 函数指针的概念并不是什么新鲜事——它实际上是 C++ 实现虚函数的方式(即 vtable)。