我有一个函数可以对字节数组进行一些检查和读取:
uint8 ReadMem(uint16 addr) {
if (addr >= 0x8000) return ROM[addr];
if (addr < 0x2000) return RAM[addr];
// some more complex checks here
return OPEN_BUS;
}
由于它是由仿真器核心使用的,因此它每秒呼叫数百万次。我想知道它的开销是多少,与3个选项相比:内联,宏和用指针调用它。
前两个选项并不好,因为功能不小,而且它被另一个选中,大多数操作码都嵌入了这个选项,如果内联,它大大增加了编译时间和exe大小。为了测试函数指针的工作方式,我必须进行重构。可以选择只编译核心一次,与模拟器的其余部分分开,但它也需要重构。
最终值得重构吗?指针的调用是否会像宏或内联一样快,或者它甚至可能更快?每种方法的缺陷可能都不是那么重要,因为功能很简单,只是有点长。非常频繁。
答案 0 :(得分:2)
指针调用是否与宏或内联一样快,或者可能 它会更快吗?
通过函数指针调用意味着您将只有另一层间接(函数调用在运行时解析)。它还意味着不能内联这样的功能。这种方法不太可能提供任何性能提升。事实上,我认为恰恰相反。 C ++的虚函数和后期绑定被认为是大型应用程序中的主要性能瓶颈的原因。
答案 1 :(得分:2)
函数指针与宏与内联
MACRO -> Compile time resolved
INLINE -> Compile time resolved
Function Pointer -> Runtime resolved
- MACRO和INLINE内容在预处理器阶段被替换,而且速度太快。但它不会在运行时发生变化,这是不利的。
- 函数指针保存函数的地址。这对于将函数地址传递给另一个函数或调用它是很有用的 使用函数指针的函数。这个过程需要更多时间。因为 在内部它已经完成了堆栈中的推/弹操作。
醇>
答案 2 :(得分:1)
宏意味着宏的定义将被每个地方的宏发生所取代。内联还意味着每个函数调用将被发生地点的函数定义替换。宏和内联的含义是,与函数调用相比,它们导致更大的代码大小。但内联和宏在执行速度方面更快。虽然函数调用较慢,因为它有堆栈管理,参数传递,跳转等的开销。所以它是根据您的优先级在两者之间进行权衡。