Buffer数据结构

来源:互联网 发布:java编程题及答案 编辑:程序博客网 时间:2024/06/06 00:18

muduo中的Buffer为封装了的vector。vector为一块连续空间,且其本身具有自动增长的性质,它的迭代器为原始指针,使用起来较为方便。 vector另外Buffer有两个data member,指向该vector中的两个元素,这两个index为int类型。
为什么这两个index为int类型?
vector自带自动扩增功能,要是index为指针的话,扩增之后指针会失效,而int类型不会发生变化
readindex和writeindex把vector分成了三个部分:prependable、readable、writable
这里写图片描述
各个空间大小计算公式为:
prependable = readIndex
readable = writeIndex - readIndex
writable = size() - writeIndex
Muduo Buffer 里有两个常数 kCheapPrepend ( kCheapPrepend 为8)和 kInitialSize(1024),定义了 prependable 的初始大小和 writable 的初始大小。(readable 的初始大小为 0。)

class Buffer : public muduo::copyable
{
public:
static const size_t kCheapPrepend = 8;//前面预留空间大小
static const size_t kInitialSize = 1024;//初始化存储数据空间

explicit Buffer(size_t initialSize = kInitialSize)
: buffer_(kCheapPrepend + initialSize),//初始化Buffer总大小
readerIndex_(kCheapPrepend),
writerIndex_(kCheapPrepend)
{
assert(readableBytes() == 0);
assert(writableBytes() == initialSize);
assert(prependableBytes() == kCheapPrepend);
}
}
如果向Buffer写入了200字节,那么布局如图1,writeIndex 向后移动了 200 字节,readIndex 保持不变,readable 和 writable 的值也有变化。
这里写图片描述
—————————————————- 图1—————————————
如果有又从 Buffer read() & retrieve() (下称“读入”)了 50 字节,结果见图 2这里写图片描述。与上图相比,readIndex 向后移动 50 字节,writeIndex 保持不变,readable 和 writable 的值也有变化(这句话往后从略)。
—————————————————- 图2—————————————
当再次向Buffer写入数据的时候,大小超过writable的大小,vector会增长

0 0
原创粉丝点击