2 个版本
0.1.1 | 2024年2月6日 |
---|---|
0.1.0 | 2023年6月12日 |
#675 在 内存管理
33KB
591 行
魔幻缓冲区
一个为 Rust 设计的魔幻环形缓冲区(或虚拟环形缓冲区)实现。 magic-buffer
提供了一种简化的方式来处理通过委托逻辑到硬件的缓冲区循环。
相同的底层缓冲区在内存中以相邻地址映射两次。这允许在虚拟地址空间中读取前向的同时绕过缓冲区。
此行为对各种应用程序很有用
- 具有固定大小缓冲区的网络协议解析器
- 可以提供连续内存片段的 VecDec 实现(例如 SliceDeq)
- IPC 环形缓冲区实现
[dependencies]
magic-buffer = "0.1"
示例
分配缓冲区
缓冲区视口必须对齐页面,并遵循操作系统的分配粒度
use magic_buffer::*;
let buf = MagicBuffer::new(1 << 16).unwrap();
OS | 架构 | 最小缓冲区长度 |
---|---|---|
Windows | x86_64 | 64 KiB |
Linux | x86_64 | 4 KiB |
OSX | x86_64 | 4 KiB |
OSX | aarch64 | 16 KiB |
** 欢迎通过 PR 完成此列表
在缓冲区中索引
use magic_buffer::*;
let mut buf = MagicBuffer::new(1 << 16).unwrap();
buf[0] = b'1';
buf[1] = b'2';
// index wraps around
assert_eq!(buf[0], buf[1 << 16]);
assert_eq!(buf[1], buf[(1 << 16) + 1]);
切片
use magic_buffer::*;
let buf = MagicBuffer::new(1 << 16).unwrap();
// the whole underlying buffer starting at pos 0
let a = &buf[..];
// the whole underlying buffer starting at pos 1
// then wrapping around with the first byte at the end
let b = &buf[1..];
依赖项
~0.3–13MB
~109K SLoC