源码结构
│ bytes.rs
│ bytes_mut.rs
│ lib.rs
│ loom.rs
│ serde.rs
│
├─buf
│ buf_impl.rs
│ buf_mut.rs
│ chain.rs
│ iter.rs
│ limit.rs
│ mod.rs
│ reader.rs
│ take.rs
│ uninit_slice.rs
│ vec_deque.rs
│ writer.rs
│
└─fmt
debug.rs
hex.rs
mod.rs
Trait
1. Buf
必须实现的方法
fn remaining(&self) -> usize
fn chunk(&self) -> &[u8]
fn advance(&mut self, cnt: usize)
另一些实现了该trait的结构体
- &[u8]
- &mut T
- Box
- Cursor
- VecDeque
2. BufMut (unsafe)
必须实现的方法
unsafe fn advance_mut(&mut self, cnt: usize)
fn chunk_mut(&mut self) -> &mut UninitSlice
fn remaining_mut(&self) -> usize
Structs
Bytes
结构
/// ```text
///
/// Arc ptrs +---------+
/// ________________________ / | Bytes 2 |
/// / +---------+
/// / +-----------+ | |
/// |_________/ | Bytes 1 | | |
/// | +-----------+ | |
/// | | | ___/ data | tail
/// | data | tail |/ |
/// v v v v
/// +-----+---------------------------------+-----+
/// | Arc | | | | |
/// +-----+---------------------------------+-----+
/// ```
pub struct Bytes {
ptr: *const u8,
len: usize,
// inlined "trait object"
data: AtomicPtr<()>,
vtable: &'static Vtable,
}
pub(crate) struct Vtable {
/// fn(data, ptr, len)
pub clone: unsafe fn(&AtomicPtr<()>, *const u8, usize) -> Bytes,
/// fn(data, ptr, len)
pub drop: unsafe fn(&mut AtomicPtr<()>, *const u8, usize),
}
- ptr : 指针
- len : 长度
以上两个参数模拟了一个切片,指向内存中的一片连续地址。
- 使用AtomicPtr和自定义的Vtable模拟trait object的行为。
- Vtable给Bytes提供动态clone()和drop()
实现trait
- 自定义trait
- Buf
- 标准trait
- AsRef
- Borrow
- Clone
- Debug
- Default
- Deref
- Drop
- Eq
- From
- FromIterator
- Hash
- IntoIterator
- LowerHex
- Ord
- PartialEq
- PartialOrd
- Send
- Sync
- UpperHex
重点场景源码学习
Bytes的Drop和Clone实现
源代码
impl Drop for Bytes {
#[inline]
fn drop(&mut self) {
unsafe { (self.vtable.drop)(&mut self.data, self.ptr, self.len) }
}
}
impl Clone for Bytes {
#[inline]
fn clone(&self) -> Bytes {
unsafe { (self.vtable.clone)(&self.data, self.ptr, self.len) }
}
}
可见Bytes的Drop和Clone都是由vtable的实现执行的。
VTable实现
Bytes实现了4种VTable
- STATIC_VTABLE
- PROMOTABLE_EVEN_VTABLE
- PROMOTABLE_ODD_VTABLE
- SHARED_VTABLE
实现Clone和Drop的思路