全景
这一部分不进 vtable 和位编码的细节,先用两个可以跑的程序把整张地图画出来:
- bytes 解决什么问题:把 64 KiB 切成 100 帧交给不同的所有者。
Vec<u8>每帧一次分配、一次拷贝;Arc<[u8]>自己记下标可以只分配一次,但从Vec转过去要整块拷贝;Bytes和BytesMut都是 1 次分配(24 或 40 字节的引用计数块)、0 字节拷贝。Buf/BufMut把读写游标从具体类型里抽出来。 - 一块缓冲的一生:照 hyper 的读路径写一个最小程序,
with_capacity(0)→reserve→ 写入 →split_to→freeze→slice→ drop → 再reserve,每一步打印指针、长度、容量、is_unique和分配次数:整个请求只分配了 8 KiB 缓冲和一个 40 字节的Shared,最后那次reserve原地复用了同一块内存。
flowchart TB alloc["BytesMut 分配缓冲"] --> write["BufMut 写入"] write --> split["split_to 切出一段"] split --> freeze["freeze 成 Bytes"] freeze --> share["clone 和 slice 共享"] share --> dropnode["各自 drop"] dropnode --> reuse["reserve 复用整块"] reuse --> write
图的上半圈(分配、写入、split_to、reserve)是构建主线,在 03 BytesMut;freeze 之后的 clone、slice、drop 是共享主线,在 02 Bytes;写入和读取用的 Buf / BufMut 在 04。
💬 关联讨论
发起讨论加载中...