现代 C++ 实战(26):LRU 缓存与 JSON 解析器
第 25 篇 给服务加了持久化;本篇是两个经典练手项目:LRU 缓存练数据结构设计,JSON 解析器练递归下降与 std::variant——都是面试高频、又能深入理解 C++ 现代特性。 demo:ref/cpp_demo/projects/learning_guide/(lru_cache/ + json_parser/)。 这是「现代 C++ 实战」系列的第 26 篇。建议先读 第 20 篇:栈、队列与链表(LRU 底层)和 第 24 篇:HTTP 服务与 JSON(nlohmann/json)。 一、LRU 缓存:设计思路LRU(Least Recently Used)——缓存满时淘汰最久未使用的项。要求 get 和 put 均 O(1)。 123456unordered_map<K, iterator> list<pair<K,V>>┌─────────────────┐ ┌──────────────────────┐│ key1 → iter1 ───┼─────────>│ (k...
大模型数学速成(11):KV Cache——推理加速的关键
没有 KV Cache,大模型逐 token 生成会反复重算整段历史的 K、V——复杂度爆炸、延迟不可接受。第 10 篇 讲了用 GQA 压缩 Cache 体积;本篇收官:Prefill / Decode 两阶段、Decode 单步在算什么、显存怎么估,以及多模态里 Cache 怎么共享。 这是「大模型数学速成」系列的第 11 篇(收官)。建议先读 第 10 篇:GQA。 一、O(N²) 重复计算问题生成第 $t$ 个 token 时,Attention 需要当前 Q 与位置 $1 \ldots t$ 的全部 K 做点积(第 05 篇)。 若不缓存 K/V,每步 Decode 都要对整段输入重新做 Q/K/V 投影和 Attention: 步数 每步参与 token 数 naive 总计算量量级 生成 $S$ 个 token $1, 2, \ldots, S$ $O(S^2)$ 重复投影 + Attention 长对话下,算力浪费在「重算旧 token 的 K/V」 上。KV Cache 的核心思想:算过的...
现代 C++ 实战(25):SQLite 数据库实战
第 24 篇 的 HTTP 服务把数据存在内存里,重启即失;SQLite 把数据库装进一个文件——零配置、嵌入式、全球部署量最大的数据库引擎。本篇用 C++ RAII 封装 DatabaseManager,实现学校管理系统的完整 CRUD。 demo:ref/cpp_demo/database/sqlite3/。 这是「现代 C++ 实战」系列的第 25 篇。建议先读 第 24 篇:HTTP 服务与 JSON。 一、为什么选 SQLite? 特点 说明 零配置 无需安装数据库服务,打开文件即用 单文件 整个库在一个 .db 文件中,备份 = 复制文件 嵌入式 以库形式链接进进程,无网络开销 ACID 支持事务,数据一致性有保障 跨平台 iOS/Android/桌面/浏览器(WASM)均内置 12345应用进程 │ ├─ DatabaseManager (C++ 封装) │ └─ libsqlite3.so ──→ school.db (单文件) 适用场景:移动 App 本地存储、桌面工具、原型...
大模型数学速成(10):GQA——分组查询注意力
第 09 篇的 MHA 里,Q、K、V 各有 $h$ 个头——推理时要为每个 token 缓存全部 K/V 头,显存随上下文长度线性暴涨。GQA(Grouped Query Attention,分组查询注意力) 让多路 Q 共享更少的 K/V 头,在效果接近 MHA 的前提下大幅压缩 KV Cache。 这一篇讲清:KV Cache 为何吃显存、GQA 怎么分组共享、以及 MHA / GQA / MQA 对照。 这是「大模型数学速成」系列的第 10 篇。建议先读 第 09 篇:多头注意力。下一篇 KV Cache(系列收官)。 一、KV Cache 显存从哪来?Decode 阶段每生成一个新 token,都要和历史上所有 token 做 Attention(第 05 篇)。历史 token 的 K、V 在 Prefill 时已算过——存下来复用,不必每步重算,这就是 KV Cache。 每层、每个 token 需缓存: \[\text{K 缓存} + \text{V 缓存} \approx 2 \times h_\text{kv} ...
现代 C++ 实战(24):HTTP 服务与 JSON
第 23 篇 收官第三季算法篇;第四季进入工程实战。第一篇从最常见的后端能力入手:用 cpp-httplib 搭 HTTP 服务,用 nlohmann/json 处理 JSON——几十行代码就能跑起一个 REST 接口。 demo:ref/cpp_demo/networking/http_json/。 这是「现代 C++ 实战」系列的第 24 篇,第四季开篇。建议先读 第 01 篇:CMake 与现代构建(FetchContent)和 第 23 篇。 一、HTTP 基础速览1234567客户端 服务端 │ GET /camera HTTP/1.1 │ │ Host: localhost:8080 ────────→ │ 路由匹配 → 处理 → 响应 │ │ │ ← HTTP/1.1 200 OK │ │ Content-Type: image/jpe...
x86 汇编入门(06):文件读写
程序不能只跟终端打交道。配置文件、日志、数据文件——都离不开文件 I/O。这一篇用 06_file_io.asm 完成「写入 → 关闭 → 重新打开 → 读取 → 输出」全流程,也是本系列的收官之作。 这是「x86 汇编入门」系列的第 6 篇,也是最后一篇。前五篇覆盖了输出、输入、算术、循环和函数。这一篇综合运用文件相关系统调用,并回顾整个系列的学习路径。 一、文件相关系统调用 调用号 名称 作用 2 sys_open 打开或创建文件 0 sys_read 从 fd 读取 1 sys_write 向 fd 写入 3 sys_close 关闭 fd sys_open 参数: 寄存器 含义 rdi 文件路径(以 \0 结尾的 C 字符串) rsi 打开标志 flags rdx 权限 mode(创建文件时有效) 返回值 rax 文件描述符;失败时为负数 常用 flags(可位或组合): 标志 值 含义 O_RDONLY 0 只读 O_WRONLY 1 只写 O_CREAT 0x40 不存在则创建...
大模型数学速成(09):多头注意力——多个专家各看各的
第 05 篇我们用的是「一整块」768 维 Q/K/V 做一次 Attention。实际模型里常见 12、16、32 个头(head)——同一层里多组更小的 Attention 并行运行,再拼回去。为什么要拆头?维度怎么变? 这一篇讲清 分头、逐头 Attention、concat 与输出投影 $W_o$ 的全流程。 这是「大模型数学速成」系列的第 9 篇。建议先读 第 05 篇:Attention 与 Softmax、第 07 篇:RoPE。下一篇 GQA。 一、单头 vs 多头:陪审团类比单头 Attention:一个「专家」用 768 维 Q/K/V 同时看所有语义侧面。 多头 Attention(MHA):$h$ 个「陪审员」,每人只拿 $d_\text{head}$ 维(如 64 维),独立做一遍 Attention,最后把 $h$ 份意见 拼接 成完整向量。 12单头:1 人 768 维全包多头:12 人各 64 维,各看各的角度,再合并报告 直觉:不同 head 可学到不同模式——有的关注语法距离,有的关注指代,有的...
现代 C++ 实战(23):字符串搜索与动态规划
第 22 篇 的图算法处理「关系」;本篇进入算法面试的两大支柱:字符串搜索(在文本中找模式)和动态规划(把大问题拆成重叠子问题)。KMP 和 Boyer-Moore 解决搜索,背包和 LCS 解决 DP——掌握这些,LeetCode 中等题大半有思路。 demo:ref/cpp_demo/algorithms/string_search/ + ref/cpp_demo/algorithms/dynamic_programming/。 这是「现代 C++ 实战」系列的第 23 篇。建议先读 第 22 篇:图算法。 一、字符串搜索全景在文本 text(长度 n)中查找模式 pattern(长度 m): 算法 时间 思路 适用 暴力 O(nm) 每个位置逐字符比 短模式、教学 KMP O(n+m) 前缀函数,失配不回退 text 通用、面试必考 Boyer-Moore 最好 O(n/m) 从右向左,坏字符跳跃 长模式、实际文本搜索 Rabin-Karp 平均 O(n+m) 滚动哈希,先比哈希再验证 多模式匹配 1234text: A ...
x86 汇编入门(05):函数调用与递归阶乘
call 和 ret 是汇编里最重要的「接力棒」。没有它们,代码只能从上到下一条道走到黑。这一篇我们拆开函数调用的完整机制,并用递归计算 5 的阶乘——在汇编里亲眼看到栈是怎么一层层长高的。 这是「x86 汇编入门」系列的第 5 篇。上一篇用跳转实现了循环。这一篇通过 05_function.asm,理解 call / ret、栈帧和 x86_64 调用约定。 一、call 和 ret 做了什么?123call factorial ; ① 把「下一条指令地址」压栈 ② 跳到 factorial...ret ; 从栈弹出地址,跳回去 可以把它想成:call 留下回城坐标,ret 按坐标回去。栈就是存放这些坐标的地方。 二、栈帧:函数自己的「工作台」每次进入函数,标准开场是: 12345678factorial: push rbp ; 保存调用者的帧指针 mov rbp, rsp ; 建立当前帧 push rbx ; 保存要用的 callee...
大模型数学速成(08):ViT 层 vs LLM 层——概念对照总表
前 7 篇我们分别讲了张量约定、矩阵乘、Q/K/V、Norm 与残差、Attention、FFN、RoPE—— pieces 齐了,但读 ViT 或 LLM 代码时仍容易混:patch 和 token 是一回事吗?为什么 ViT 双向、LLM 因果?RMS Norm 和 LayerNorm 谁在哪? 这一篇不引入新公式,用 一张骨架图 + 对照大表 把视觉 Transformer 与语言模型在同一套数学语言下对齐,并给出后续阅读路径。 这是「大模型数学速成」系列的第 8 篇。建议已读 第 00–07 篇。下一篇 多头注意力。 一、共同的 Transformer 骨架无论 ViT 还是 LLM,一层 block 的核心结构相同(Pre-LN 写法): 12345678输入 X [d, S] S = 序列长度(patch 数或 token 数) │ ├─ Norm ──► Self-Attention ──► + 残差 │ ├─ Norm ──► FFN ──► + 残差 │ ▼输出 X' [d, S...















