一尘不染

功能表与golang中的switch

go

我正在用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

非常感谢你。


阅读 324

收藏
2020-07-02

共1个答案

一尘不染

  1. 第一个版本对我来说更好,YMMV。

  2. 进行基准测试。取决于编译器的优化能力。如果编译器没有尽力进行优化,则“跳转表”版本可能会更快。

  3. 取决于您对“内联声明函数”的定义。Go只能在顶层声明和定义函数/方法。但是函数是Go中的一等公民,因此可以具有变量/参数/返回值和函数类型的结构化类型。在所有这些地方,也可以将函数文字分配给变量/字段/元素…

  4. 可能吧 我仍然建议不要将cpu状态保持在全局变量中。一旦您可能决定去仿真多核,它将是受欢迎的;-)

2020-07-02