Tokio Bytes概述
Tokio Bytes概述
crate 介绍
Tokio Bytes crate 为处理 byte 的工作提供抽象。
bytes crate 提供了一个高效的字节缓冲结构(Bytes)和用于处理缓 buffer 实现的特征(Buf, BufMut)。
资料:
Bytes
Bytes 是一个高效的容器,用于存储和操作连续的内存片段。它主要用于网络代码中,但也可以应用于其他地方。
Bytes 通过允许多个 Bytes 对象指向相同的底层内存来促进零拷贝(zero-copy)网络编程。这是通过使用一个引用计数来跟踪内存何时不再需要并可以被释放来进行管理的。
Bytes 句柄可以直接从现有的字节存储(如 &[u8]
或 Vec<u8>
)中创建,但通常先使用 BytesMut
并写入。比如说。
use bytes::{BytesMut, BufMut};
let mut buf = BytesMut::with_capacity(1024);
buf.put(&b"hello world"[..]);
buf.put_u16(1234);
let a = buf.split();
assert_eq!(a, b"hello world\x04\xD2"[..]);
buf.put(&b"goodbye world"[..]);
let b = buf.split();
assert_eq!(b, b"goodbye world"[..]);
assert_eq!(buf.capacity(), 998);
在上面的例子中,只分配了一个 1024 的缓冲区。句柄 a 和 b 将共享底层的 buffer,并维护跟踪进入句柄所代表的缓冲区的视图的索引。
Buf, BufMut
这两个特征提供了对缓冲区的读和写访问。底层存储可能是也可能不是连续的内存。例如,Bytes
是一个保证连续内存的缓冲区,但是 rope
将字节存储在不连续的块中。Buf 和 BufMut 维护跟踪底层字节存储的当前位置的游标。当字节被读取或写入时,游标被推进。
读和写的关系
乍一看,Buf
和 BufMut
似乎与 std::io::Read
和 std::io::Write
在功能上有重合。然而,它们有不同的用途。buffer 是作为参数提供给 Read::read
和 Write::write
的值。然后,Read
和Write
可能会执行一个系统调用,这有可能会失败。对Buf
和BufMut
的操作是不是失败的。
crate的内容
结构体:
- Bytes :廉价的可克隆和可切分的连续内存块。
- BytesMut: 对连续的内存片的唯一引用。
模块:
- buf: 用于处理缓冲区的实用程序。
trait:
- Buf : 从 buffer 中读取字节。
- BufMut : 一种用于提供对 bytes 连续写访问的特性