Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

零拷贝缓冲区

简介

asco::io::buffer 是一个支持零拷贝的数据缓冲区,适用于高性能 IO 场景。 它通过链式结构管理多个缓冲帧(frame),每个缓冲帧可以是原始数组、字符串或字符串视图, 实现数据的高效拼接与转移,避免不必要的内存拷贝。

具有一个默认为 char 的模板参数 CharT,可容纳多种等长的字符集。也可传入 std::byte 将其作为纯字节缓冲区。

主要特性

  • 零拷贝设计:通过 std::variant 管理不同类型的数据块,减少数据拷贝次数。
  • 链式缓冲帧:每个缓冲帧独立管理,支持动态扩展和拼接。
  • 多种数据类型支持:支持 charstd::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 现在为空

注意事项

  • 禁止拷贝构造,避免误用导致多重释放。
  • 线程不安全,需自行加锁。