DeskFlow 字节缓冲区设计(零拷贝队列)

这是一个先进先出的队列结构,队列中的元素是vector。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class StreamBuffer
{
public:
    StreamBuffer() = default;
    ~StreamBuffer() = default;

    // 无删除、无拷贝的高效数据读取地读取缓冲区数据,将数据合并到第一个块中并返回这个块的地址。  
    // peek方法实现了智能的块合并策略:当请求的数据跨越多个块时,会自动将多个块合并到第一个块中,确保返回连续的内存空间。
    const void *peek(uint32_t n);

    // 从m_chunks的头部丢弃指定数量的字节
    void pop(uint32_t n);

    // 向m_chunks中写入指定字节数
    void write(const void *data, uint32_t n);  

    uint32_t getSize() const;  // m_size

private:
    static const uint32_t kChunkSize;     // 用来限制单个Chunk的最大容量

    using Chunk = std::vector<uint8_t>; 
    using ChunkList = std::list<Chunk>;   // 队列中每一个Chunk最大只能是4096

    ChunkList m_chunks;
    uint32_t m_size = 0;                  // m_chunks包含的总字节数
    uint32_t m_headUsed = 0;              // m_chunks中第一个Chunk块中已弹出的字节数量
};

1
const uint32_t StreamBuffer::kChunkSize = 4096;
comments powered by Disqus