我正在用go编写一个简单的模拟器(我应该还是应该回到c?)。无论如何,我正在获取指令并对其进行解码。在这一点上,我有一个字节,如0x81,我必须执行正确的功能。
我应该有这样的东西吗
func (sys *cpu) eval() { switch opcode { case 0x80: sys.add(sys.b) case 0x81: sys.add(sys.c) etc } }
或类似的东西
var fnTable = []func(*cpu) { 0x80: func(sys *cpu) { sys.add(sys.b) }, 0x81: func(sys *cpu) { sys.add(sys.c) } } func (sys *cpu) eval() { return fnTable[opcode](sys) }
1.哪个更好? 2.哪个更快? 还可以 3.我可以内联声明一个函数吗? 4.我有一个cpu struct我有寄存器等的地方。如果我有寄存器并且全部作为全局变量会更快吗?(没有struct)
cpu
struct
非常感谢你。
第一个版本对我来说更好,YMMV。
进行基准测试。取决于编译器的优化能力。如果编译器没有尽力进行优化,则“跳转表”版本可能会更快。
取决于您对“内联声明函数”的定义。Go只能在顶层声明和定义函数/方法。但是函数是Go中的一等公民,因此可以具有变量/参数/返回值和函数类型的结构化类型。在所有这些地方,也可以将函数文字分配给变量/字段/元素…
可能吧 我仍然建议不要将cpu状态保持在全局变量中。一旦您可能决定去仿真多核,它将是受欢迎的;-)