Buffer类设计
Buffer 类
Buffer类是一个简单的缓冲区实现,用于管理动态大小的字符缓冲区。主要用于在输入和输出之间缓存数据,以减少系统调用的次数。
构造函数
Buffer(int initBuffSize = 1024): 构造函数,可以传入一个初始缓冲区大小,默认为 1024。
公共成员函数
WritebleBytes() const: 返回可写字节数。ReadableBytes() const: 返回可读字节数。PrependableBytes() const: 返回可预留字节数。Peek() const: 返回当前读取位置的指针。EnsureWriteable(size_t len): 确保缓冲区可写的长度足够。HasWritten(size_t len): 移动写指针,表示已写入指定长度的数据。Retrive(size_t len): 从缓冲区中读取指定长度的数据。RetriveUntil(const char* end): 读取数据直到指定的结束位置。RetriveAll(): 读取所有数据,并清空缓冲区。RetriveAllToStr(): 读取所有数据并返回为字符串。BeginWriteConst() const: 返回写指针的位置。BeginWrite(): 返回写指针的位置,用于写入数据。Append(const std::string& str): 将字符串追加到缓冲区。Append(const char* str, size_t len): 将指定长度的字符数组追加到缓冲区。Append(const void* data, size_t len): 将二进制数据追加到缓冲区。Append(const Buffer& buff): 将另一个缓冲区的内容追加到当前缓冲区。ReadFd(int fd, int* Errno): 从文件描述符中读取数据到缓冲区。WriteFd(int fd, int* Errno): 将缓冲区的数据写入文件描述符。
私有成员函数
BeginPtr_(): 返回缓冲区的起始指针,用于内部访问。MakeSpace_(size_t len): 确保缓冲区可写的长度足够,如果不够则进行扩展。
成员变量
std::vector<char> buffer_: 使用std::vector存储字符数据的缓冲区。std::atomic<std::size_t> readPos_: 读取位置的原子计数器。std::atomic<std::size_t> writePos_: 写入位置的原子计数器。
头文件
#include<cstring>: C 字符串操作函数的头文件。#include<iostream>: 输入输出流相关的头文件。#include<unistd.h>: POSIX 操作系统 API 的头文件。#include<sys/uio.h>: 提供readv函数的头文件。#include<vector>: C++ 标准库中的动态数组容器。#include<atomic>: C++ 标准库中的原子操作。#include<assert.h>: 断言相关的头文件。
宏定义
#ifndef BUFFER_H: 防止头文件被多次引用。#define BUFFER_H: 定义头文件。
总体来说,这个 Buffer 类提供了一组简单但功能齐全的接口,用于管理缓冲区的读写操作。在多线程环境下,使用原子计数器确保了对读写位置的线程安全访问。
上面是GPT生成的总结,对于该Buffer类实际上,将上面的功能汇总大致可以分为
- 制定一个固有大小(1024)的vector
- 获取关于当前读下标,写下标以及可读可写的大小,以及操控读写指针进行移动的功能。
- 提供make_space即扩容功能,一般在读写超过buffer大小时进行扩容,在read时要求一次性读入,这样是为了减少系统调用,写时没有这个要求。话说这里要插一嘴要分清,readFd和writeFd的功能,read表示将fd中的数据读入buffer中,write是将buffer中的数据写入fd,所以读时才有可能需要扩容操作。