Rust in Everything
基于 bytes 1.12.1

全景

这一部分不进 vtable 和位编码的细节,先用两个可以跑的程序把整张地图画出来:

  1. bytes 解决什么问题:把 64 KiB 切成 100 帧交给不同的所有者。Vec<u8> 每帧一次分配、一次拷贝;Arc<[u8]> 自己记下标可以只分配一次,但从 Vec 转过去要整块拷贝;Bytes 和 BytesMut 都是 1 次分配(24 或 40 字节的引用计数块)、0 字节拷贝。Buf / BufMut 把读写游标从具体类型里抽出来。
  2. 一块缓冲的一生:照 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。

💬 关联讨论

发起讨论
加载中...