零拷贝缓冲区
简介
asco::io::buffer
是一个支持零拷贝的数据缓冲区,适用于高性能 IO 场景。
它通过链式结构管理多个缓冲帧(frame),每个缓冲帧可以是原始数组、字符串或字符串视图,
实现数据的高效拼接与转移,避免不必要的内存拷贝。
具有一个默认为 char
的模板参数 CharT
,可容纳多种等长的字符集。也可传入 std::byte
将其作为纯字节缓冲区。
主要特性
- 零拷贝设计:通过
std::variant
管理不同类型的数据块,减少数据拷贝次数。 - 链式缓冲帧:每个缓冲帧独立管理,支持动态扩展和拼接。
- 多种数据类型支持:支持
char
、std::byte
及其字符串类型。 - 高效拼接与转移:支持将其他 buffer 对象高效拼接进当前缓冲区。
主要接口
构造与赋值
buffer()
:创建一个空缓冲区。buffer(CharT value)
:以单个字符初始化缓冲区。buffer(std::basic_string<CharT> &&str)
:以字符串右值初始化缓冲区。buffer(const std::basic_string_view<CharT> &str)
:以字符串视图初始化缓冲区。- 禁止拷贝构造,支持移动构造。
数据写入
void push(CharT value)
:向缓冲区追加单个字符。void push(std::basic_string<CharT> &&str)
:追加字符串(右值)。void push(const std::basic_string_view<CharT> &str)
:追加字符串视图。void push(buffer &&buf)
:拼接另一个 buffer,将其内容高效转移到当前缓冲区,原 buffer 被清空。
数据读取
std::basic_string<CharT> to_string()
:将缓冲区所有内容合并为一个字符串,并清空缓冲区。
其他
void swap(buffer &rhs)
:与另一个 buffer 交换内容。void clear()
:清空缓冲区内容。size_t size() const
:返回缓冲区内数据总字节数/字符数。std::tuple<buffer, buffer> split(buffer &&self, size_t pos)
:将当前 buffer 按指定位置分割为两个 buffer, 第一个包含前pos
个元素,第二个包含剩余部分。分割后原 buffer 为空。若pos
超出范围会抛出异常。
split 用法示例
asco::io::buffer buf;
buf.push('A');
buf.push(std::string("Hello"));
buf.push(std::string_view("World"));
// buf: "AHelloWorld"
auto [first, second] = std::move(buf).split(6);
// first: "AHello"
// second: "World"
// buf 现在为空
注意事项
- 禁止拷贝构造,避免误用导致多重释放。
- 线程不安全,需自行加锁。