图解 Rust dyn Trait 的 vtable
文章是 C++ 开发者视角的内存实验笔记,对照 C++ virtual functions / CRTP 与 Rust 的 monomorphization、dyn Trait。代码与实验在 GitHub 仓库 sofiabelen/rust-vtables-for-cpp-programmers。
静态分发下,编译器为每个具体类型生成函数副本,运行时无额外开销,但类型须在编译期已知。空结构体在 Rust 中是 ZST,size_of 可为 0;身份由所有权与借用检查跟踪,不依赖“对象至少 1 字节”的地址约定。debug 下本地 ZST 可能占占位地址,release 下地址可折叠,编译器不对 ZST 地址作保证。
动态分发使用 &dyn Draw:普通引用约 8 字节,trait object 约 16 字节,是 data 指针加 vtable 指针的宽指针;同类型实例共享同一 vtable。调度策略在调用点选择:&Circle 静态,&dyn Draw 动态,vtable 不嵌在对象内。一个类型实现多个 trait 时,每个 (Type, Trait) 对有独立 vtable。可 dyn 的 trait 需满足 object safety,例如方法不能返回 Self、不能带泛型参数。
原文链接:https://sofiabelen.github.io/projects/visualizing-rusts-vtables-how-dyn-trait-works-in-memory/
GSim-RS:体积毛坯 G-code 仿真
GSim-RS 是用 Rust 写的 G-code 仿真器,面向立式 CNC 铣床的 Fanuc 风格 G-code。解析并解释 G-code,维护机床状态,并对刀路与切削做体积仿真。新版本支持立方体毛坯体积仿真,毛坯与刀具尺寸可通过程序 JSON 配置;仿真支持环绕、平移、缩放,以及等距/顶视/前视/右视切换。
架构拆成解析、解释、几何构建、仿真渲染与机床状态渲染。GUI 用 WGPU 在主线程做 G-code 解析、执行与仿真渲染,TUI 用 Ratatui 在另一线程显示活动机床状态。线程间按数据类型分别用 Arc<Mutex>(可丢弃更新)和 mpsc::channel(必达)通信。体积仿真对每帧做部分 GPU buffer 更新,避免整块 stock 重传;内向体素面启动时隐藏,邻接体素被切掉后再显露。可 cargo install gsim-rs 安装。
原文链接:https://github.com/navrajkalsi/gsim-rs
shotdock:Wayland 截图录屏与窗口装帧
shotdock 是面向 Wayland 的截图与录屏工具,带窗口装帧和可选浮动 dock,支持 Hyprland、Sway、River、Niri 等合成器。区域/窗口 snip 基于 slurp,可对截图加圆角、高斯阴影、macOS 风格标题栏和渐变画布;也支持 shotdock frame <file> 对已有图片离线装帧。
功能还包括区域选择时冻结屏幕(hyprpicker)、60 FPS H.264 录屏(wf-recorder,监视器/窗口/区域)、OCR 抽文字到剪贴板(tesseract),以及可选的 GTK4 LayerShell 浮动工具栏。可通过 AUR、GitHub Release 二进制或 cargo build --release 安装;依赖 grim、slurp、ImageMagick、wl-clipboard 等。
原文链接:https://github.com/sirrryasir/shotdock
jsonquery_gui:egui 大 JSON 多方言查询
jsonquery_gui 是用 Rust 与 egui/eframe 写的原生桌面应用,用于浏览和查询较大 JSON:拖入文件或粘贴内容后,可用 jq、JSON Pointer、JSONPath 或 JMESPath 查询。jq 通过内嵌 jaq 解释器执行,不 shell 到外部进程;查询可流式输出且可取消,大整数按字节精确往返,并支持 NDJSON。
界面提供源文档与结果的树视图/原文视图切换、搜索、右键复制节点路径或保存节点;Linux 与 Windows 有预编译包,Linux 另有 Homebrew tap。当前 Phase 1 为全量内存解析,适合中小文件;多 GB 级需尚未实现的 Phase 2 内存映射懒解析索引。MIT 许可。
原文链接:https://github.com/nujufas/jsonquery_gui
From Rust中文社区 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论