golang 中的函数与 switch 的表

2024-01-02

我正在用 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.哪个更快?
also
3.我可以内联声明一个函数吗?
4.我有一个cpu struct其中我有寄存器等。如果我有寄存器并且全部作为全局变量,会更快吗? (没有struct)

非常感谢。


我做了一些基准测试,一旦案例数量超过 4 个,表格版本就会比开关版本更快。

我惊讶地发现 Go 编译器(gc,无论如何;不确定 gccgo)似乎不够智能,无法将密集开关转换为跳转表。

Update: Ken Thompson 在 Go 邮件列表上发布了描述优化交换机的难点 https://groups.google.com/d/msg/golang-nuts/IURR4Z2SY7M/R7ORD_yDix4J.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang 中的函数与 switch 的表 的相关文章

  • 在 Go 中使用 init() 函数真的很糟糕吗?

    几天前我开始了一个新的 go 项目 我使用 golangci lint 使我的代码具有良好的风格 我发现 gochecknoinits 是 golangci lint 的 linter 之一 它告诉我不要使用 init 在我看来 为了方便起
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • Ajax 将文件上传到内容类型为 Multipart 的 GoLang 服务器

    我正在尝试使用多部分表单将音频文件上传到 Golang 服务器 然而 Go 返回错误 multipart NextPart bufio buffer full 我相信这表明我的 Javascript 请求中存在不属于多部分格式的内容 这是我
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 如何顺序运行 golang 测试?

    当我跑步时go test 我的输出 FAIL TestGETSearchSuccess 0 00s Location drivers api test go 283 Error Not equal 200 expected 204 actu
  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • 如何在 Go 应用程序中处理打开/关闭数据库连接?

    我的 Web API 应用程序中有一组函数 他们对 Postgres 数据库中的数据执行一些操作 func CreateUser db err sql Open postgres user postgres password passwor
  • 展平嵌套结构会导致切片的切片

    所以我有一个像这样的结构 type Bus struct Number string Name string DirectStations Station Station is another struct ReverseStations
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 如何使用 Bochs 运行汇编代码?

    我想使用 Bochs 作为 8086 模拟器 是否有捷径可寻 我想要的是类似 emu8086 的东西 http www emu8086 com http www emu8086 com 如果程序的初始部分适合 512 字节 并且您不介意将自
  • GOMAXPROCS 默认值是多少?

    不设置同名环境变量时是否保证GOMAXPROCS设置为1 此代码显示的值 package main import runtime fmt func getGOMAXPROCS int return runtime GOMAXPROCS 0
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 复杂数据类型作为 Go 中映射的键

    我正在尝试在 Go 中创建一个由大整数作为键的映射 effective Go 明确指出 结构体 数组和切片不能用作映射键 因为这些类型上没有定义相等性 这是有道理的 我当然可以将大整数转换为字符串并使用字符串作为键 但我在这里寻找更通用的解
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替

随机推荐

  • 如何将参数传递给 Hudson 作业的 shell 命令

    我有一个 Hudson 工作 在远程服务器上执行 shell 脚本 其shell命令是 usr bin deployWar sh warfileName 我将此构建标记为参数化 并添加了一个字符串参数 name warFileName de
  • django 如何断言 url 模式解析为正确的基于类的视图函数

    我有一个基于阶级的观点 class HomePage View def get self request return HttpResponse p This is content p 和 url pattern 定义如下 urlpatte
  • 为什么默认情况下不允许返回 JSON 的 GET 请求?

    作为 ASP NET MVC 2 Beta 2 更新的一部分 默认情况下不允许 JSON GET 请求 看来你需要设置JsonRequestBehavior字段到JsonRequestBehavior AllowGet在返回之前JsonRe
  • #if RELEASE 会像 C# 中的 #if DEBUG 一样工作吗?

    在我见过的 if 编译器指令的所有示例中 它们都使用 DEBUG 我可以以同样的方式使用 RELEASE 来排除在调试模式下编译时不想运行的代码吗 我想用这个块包围的代码会发送一堆电子邮件 我不想在测试时意外地发送这些电子邮件 RELEAS
  • 将 Google C++ 测试框架与 CMake 结合使用的最简单示例

    我有一个非常简单的 C 库 一个头文件 一个 cpp 文件 我想使用 Google C 测试框架为此项目编写单元测试 这是目录结构 project1 project1 cpp project1 h project1 unittests cp
  • 动态更改视频使 play() 请求被新的加载请求中断

    动态更改视频时 我在服务器控制台下收到以下错误 index 71 Uncaught in promise DOMException The play request was interrupted by a new load request
  • 在Python中,如何从点分json文件生成嵌套字典?

    我有一个 json 文件 例如 a 0 7615894039735099 a b 0 7152317880794702 a c 0 026490066225165563 a b d 0 0001 f 0 002 f g 0 00003 h
  • 使用CSS限制响应式图像的高度

    我的最终目标是拥有液体 img 仅使用 css 不会扩展超过父 祖父元素的显式设置高度 目前我正在用正常的 max width 100 height auto 流体图像和 javascript 通过从 img 标签读取高度 宽度属性 计算长
  • EditorFor 用于字符串列表

    我希望用户输入 5 个字符串 问题的可能答案 所以我的问题视图模型中有这些元素 private IEnumerable
  • 在鞋子中,如何将堆栈停靠在窗口底部?

    在鞋子中 我如何将堆栈停靠在窗口底部 例如我有以下代码片段 Shoe app do stack height gt 100 do background red end stack height gt 100 do background bl
  • 如何将 Automapper 与 Autofac 结合使用

    我已经升级到最新版本的 AutoMapper 9 0 并将静态配置更改为 public static IMapper RegisterAutoMapper var config new MapperConfiguration cfg gt
  • 如何使用 HTML 和 CSS 作为 Java 应用程序 GUI?

    我想设计具有干净 GUI 的新 Git 客户端 是否可以在 java 应用程序中使用 HTML CSS 和 JavaScript 的强大功能 我想使用 Java JGit 作为模型 Java 作为控制器 HTML CSS JavaScrip
  • 将标准输出流式传输到网页

    这看起来应该是一件非常简单的事情 不幸的是 Web 开发从来都不是我的强项 我有很多脚本 我想从网页启动它们并查看页面上的实时标准输出文本 有些脚本需要很长时间才能运行 因此正常的单一响应不够好 我已经开始工作了 据我所知 我的选择是 st
  • .DrawImage 具有不透明度?

    g DrawImage 是的 在我的图片框中画一个图像 是否可以给它一个不透明属性 我一直在查看 DrawImage 的其他版本 但找不到这样的东西 您必须使用 ColorMatrix 来混合图像 这是我不久前编写的一个 C 控件 它向您展
  • 哪些小部件约束对于 Grails 域类有效?

    你能告诉我有效值的列表吗小部件约束 http grails org doc 2 0 x ref Constraints widget html下面 一些小部件 例如 static constraints someField widget s
  • Visual Studio 增量构建:XML 文档文件创建得太晚

    我有一个 Visual Studio 2005 的 DLL 项目 它打开了 XML 文档文件 每当我进行增量构建时 在构建后事件执行期间 输出目录中没有 XML 文档文件 如果我在构建后事件期间暂停构建 使用来自GnuWin32 CoreU
  • 使用单个 NSMutableArray 填充 UITableView 部分表

    抱歉再次询问带有完整描述的问题 我有 resultsArray 其中包含从服务器获取的标题描述等 但问题是我想分节显示此数据 假设有来自数组的三个部分 那么如何使用单个 resultArray 填充每个部分中的数据 NSString tab
  • isset() 的 PHP 简写? [复制]

    这个问题在这里已经有答案了 如果 PHP 中不存在某个变量 是否有一种快捷方式将其分配给该变量 if isset var var 我想做类似的事情 var var PHP 7 更新 谢谢震惊狂野 https stackoverflow co
  • 可以使用 Firebase RemoteConfig 来存储 API 密钥吗?

    注意 澄清一下 这不是 Firebase API 密钥 这可能更像是一个令牌 客户端应用程序拥有并由服务器端点验证的东西 我们正在努力更好地保护 API 密钥 想想用于验证端点客户端的令牌 这一切都将在我们的内部网络上 但我们仍然希望确保只
  • golang 中的函数与 switch 的表

    我正在用 go 编写一个简单的模拟器 我应该吗 还是应该回到 c 不管怎样 我正在获取指令并对其进行解码 此时我有一个像 0x81 这样的字节 我必须执行正确的函数 我应该有这样的东西吗 func sys cpu eval switch o