Telegram Chain Buffer
当我们从网络中一段段的读取数据来组成完整的数据包,如果简单的使用类似 std::string
一直往上叠加数据时,将导致频繁的重复 alloc -> copy -> free
过程,Telegram 设计了一个链式的缓冲区来处理完整数据包的片段。
BufferRaw
BufferRaw
是操作内存的原始对象,它会通过 unique_ptr
被持有,但不是只有一个对象持有,它能有一个可写的对象,可以有多个可读的对象来引用它。
data_size_
与我们平常使用标准库容器 capacity
的语意是一样的,指示当前对象申请的存储空间大小,而 begin_
与 end_
指示当前写入数据的范围。
ChainBufferWriter
当我们要写入数据时,可以使用 ChainBufferWriter
来操纵它,一般的操作是准备一块内存 prepare_append
,然后将数据复制到这块内存上,然后再确认写入的数据量 confirm_append
。
ChainBufferReader
当我们要从其它线程中读取 ChainBufferWriter
写入的数据时,可以通过 ChainBufferWriter::extract_reader
来获取 ChainBufferReader
对象。
一般情况下,我们先通过 sync_with_writer
来与 ChainBufferWriter
同步,然后使用 prepare_read
来获取数据,再使用 confirm_read
来移除读过的数据。
BufferBuilder
ChainBufferWriter
是一个前向的列表,以字符流的方式写入数据,而 BufferBuilder
提供了一种方式可在列表前插入数据的方式。