0034-Bytes-bytes源码阅读
环境
- Time 2022-05-27
- Rust 1.61.0
- Bytes 1.1.0
前言
说明
参考:https://github.com/tokio-rs/bytes
目标
了解 bytes.rs
中 Bytes
的结构定义。
lib.rs
首先将 bytes.rs
引入到 lib.rs
中,然后进行了重新导出 Bytes
。
mod bytes;
pub use crate::bytes::Bytes;
Bytes
Bytes
的结构体定义,一个原始指针和原子指针,加上一个 usize
的长度和一个引用。占用空间 4 个 usize
的大小。
pub struct Bytes {
ptr: *const u8,
len: usize,
data: AtomicPtr<()>,
vtable: &'static Vtable,
}
Vtable
Vtable
定义了两个函数指针,一个 clone
,一个 drop
。
pub(crate) struct Vtable {
pub clone: unsafe fn(&AtomicPtr<()>, *const u8, usize) -> Bytes,
pub drop: unsafe fn(&mut AtomicPtr<()>, *const u8, usize),
}
AtomicPtr
AtomicPtr
是一个原子指针,可以在线程间安全地共享和移动。
#[cfg(target_has_atomic_load_store = "ptr")]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T> Send for AtomicPtr<T> {}
#[cfg(target_has_atomic_load_store = "ptr")]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T> Sync for AtomicPtr<T> {}
可以看到在标准库中,为 AtomicPtr
实现了 Send
和 Sync
。
UnsafeCell
AtomicPtr
内部是一个 UnsafeCell
,其不是线程安全的。
pub struct AtomicPtr<T> {
p: UnsafeCell<*mut T>,
}
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: ?Sized> Send for RefCell<T> where T: Send {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for RefCell<T> {}
UnsafeCell
未实现 Sync
,并且只对实现了 Send
的 T 才实现 Send
。不过原始指针未实现 Sync
和 Send
,所以 UnsafeCell<*mut T
相当于未实现 Sync
和 Send
。
原始指针
可以看到原始指针既没有实现 Sync
,也没有实现 Send
。
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for *const T {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for *mut T {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Send for *const T {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Send for *mut T {}
总结
查看了 Bytes
结构体中,每个字段的定义,以及 Vtable
的定义。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2020-08-30 【JavaScript】String 实例方法(三)