拆开 Hical:一个 HTTP 请求从 socket 字节到路由分发的完整旅程

[Hical] 一个 HTTP 请求在 Hical 里经历了什么?从 socket 字节到路由分发 本专栏文章:拆开 Hical · 第 1 篇 用过 Web 框架的人很多,知道"一个请求怎么从 socket 字节变成 handler 参数"的人很少。大部分框架把这层封装得严严实实,你只要写 app.get("/", handler) 就行。 但这篇文章要干相反的事——把 Hical 的整个请求处理链路扒开看。读完你能回答:请求头为什么零堆分配、响应头怎么一次 async_write 发出去、ReadBufferPool 为什么是请求级 borrow 而不是连接级持有。 1. 大图:一个请求的完整旅程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 socket 上来了字节 │ ▼ readBuf = ReadBufferPool::acquire() ← 借一块 8KB 缓冲 │ ▼ picohttpparser 解析 → phr_header[64] ← 请求头解析到栈数组 │ ▼ 构造 NativeRequest (string_view) ← 零拷贝,指针指到 readBuf │ ▼ Router::dispatch(req) ──→ handler 协程 ← 你的业务代码 │ ▼ NativeResponse::serializeHeadTo(buf) ← 序列化到栈上 512 字节 │ ▼ async_write(socket, buf) ← 一次异步写 │ ▼ readBuf 还给 ReadBufferPool::return_() ← 归还 8KB 缓冲 下面每一步都拆开讲"为什么这样设计"。 ...

August 10, 2026 · 6 min · 1273 words

深入学习 std::span

深入学习 std::span 头文件:<span> 命名空间:std 编译器要求:C++20 起 一、设计动机:统一连续内存的访问接口 1.1 C++ 中连续内存的 N 种传参方式 在没有 span 之前,传递"一段连续内存"的方式五花八门: 1 2 3 4 5 6 7 8 9 10 11 12 13 // 方式1:C 风格——指针 + 长度(容易出错,长度可能传错) void process(const int* data, size_t len); // 方式2:模板——编译膨胀,每种容器实例化一份 template <typename Container> void process(const Container& c); // 方式3:特化 vector 引用——不接受 array 或 C 数组 void process(const std::vector<int>& v); // 方式4:迭代器对——语法啰嗦,不直观 template <typename Iter> void process(Iter begin, Iter end); 核心问题: 没有一种统一的、类型安全的方式说"我只需要一段连续内存的只读/可写视图"。 1.2 span 的解法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <span> #include <vector> #include <array> #include <cstdio> // ✅ 一个函数接受所有连续内存容器 void process(std::span<const int> data) { for (int val : data) { printf("%d ", val); } printf("\n"); } int main() { // span 能从任何连续内存容器隐式构造 std::vector<int> vec = {1, 2, 3, 4, 5}; std::array<int, 3> arr = {10, 20, 30}; int cArr[] = {100, 200, 300, 400}; process(vec); // vector → span:隐式转换 process(arr); // array → span:隐式转换 process(cArr); // C 数组 → span:隐式转换 process({vec.data() + 1, 3}); // 子区间:手动指定 {ptr, count} } 一句话总结:span 是连续内存的"通用视图"——不拥有数据、不分配内存、只是指针+长度的薄封装。 ...

May 25, 2022 · 10 min · 1921 words