缓冲区Buffer(带廉价前置空间的可压缩线性缓冲区)
今天介绍的是一种缓冲区由于我在学习服务器认识到一种缓冲区觉得设计的还挺好的所以就介绍给大家。先看整体的代码static const int kPrePendIndex 8; // prependindex长度 static const int kInitalSize 1024; // 初始化开辟空间长度 class Buffer{ public: DISALLOW_COPY_AND_MOVE(Buffer); Buffer(); ~Buffer(); // buffer的起始位置 char *begin(); // const对象的begin函数使得const对象调用begin函数时 // 所得到的迭代器只能对数据进行读操作而不能进行修改 const char *begin() const; char *beginread(); const char *beginread() const; char *beginwrite(); const char *beginwrite() const; // 添加数据 void Append(const char *message); void Append(const char *message, int len); void Append(const std::string message); // 获得可读大小等 int readablebytes() const; int writablebytes() const; int prependablebytes() const; // 查看数据但是不更新read_index_位置 char *Peek(); const char *Peek() const; std::string PeekAsString(int len); std::string PeekAllAsString(); // 取数据取出后更新read_index,相当于不可重复取 // 定长 void Retrieve(int len); std::string RetrieveAsString(int len); // 全部 void RetrieveAll(); std::string RetrieveAllAsString(); // 某个索引之前 void RetrieveUtil(const char *end); std::string RetrieveUtilAsString(const char *end); //查看空间 void EnsureWritableBytes(int len); private: std::vectorchar buffer_; int read_index_; int write_index_; };这个缓冲区适用于可读可写的情况他里面有三个模块最前边的是prependable中间是readable后边是writable版本快。分别是预留可读可写板块。这里面的预留和已读板块是放在一起说的。他的最大的特点就是可以压缩掉已读的空间将可读空间往前copy一下每次追加新的数据就会执行一个判断语句if可写的数据大小lenwritable那么就是直接写else if查看压缩后是否够用如果够用就压缩然后追加else压缩过还不够只能增加writable的大小了我们这里的缓冲区维护的是vector的数组所以可以resize大小我们看一下代码void Buffer::EnsureWritableBytes(int len){ if(writablebytes() len) return; if(writablebytes() prependablebytes() kPrePendIndex len){ // 如果此时writable和prepenable的剩余空间超过写的长度则先将已有数据复制到初始位置 // 将不断读导致的read_index_后移使前方没有利用的空间利用上。 std::copy(beginread(), beginwrite(), begin() kPrePendIndex); write_index_ kPrePendIndex readablebytes(); read_index_ kPrePendIndex; }else{ buffer_.resize(write_index_ len); } }其次就是维护两个索引来计算预留可读可写空间。int read_index_; int write_index_;0preread_index_write_index_buffer.size()preread_index_-perwirte_index_-read_index_buffer.size()-write_Index_预留空间大侠已读大小可读大小可写大小缓冲区大小剩下的就是一些Retrieve的功能逻辑比较简单这里不在一一赘述其实这个预留空间目前并没有用到其实是非常有用的有的时候问们要先在缓冲过去写入正文然后再写进缓冲区可以用来封装报头。

相关新闻

如何快速掌握AssetStudio:完整游戏资源提取实战指南

如何快速掌握AssetStudio:完整游戏资源提取实战指南

如何快速掌握AssetStudio:完整游戏资源提取实战指南 【免费下载链接】AssetStudio AssetStudio is an independent tool for exploring, extracting and exporting assets. 项目地址: https://gitcode.com/gh_mirrors/ass/AssetStudio AssetStudio是一款功能…

2026/10/12 10:47:35 阅读更多 →
智能办公AI助手架构设计与实施指南

智能办公AI助手架构设计与实施指南

1. 智能办公AI助手的行业背景与核心价值过去三年间,企业办公场景的数字化需求呈现爆发式增长。根据Gartner 2023年 workplace technology调研报告,78%的企业正在或计划部署智能办公解决方案。这类系统最核心的痛点在于:传统OA系统仅实现流程电…

2026/10/12 10:06:00 阅读更多 →
G-Helper终极指南:轻量级华硕笔记本控制工具深度解析

G-Helper终极指南:轻量级华硕笔记本控制工具深度解析

G-Helper终极指南:轻量级华硕笔记本控制工具深度解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exp…

2026/10/3 17:04:01 阅读更多 →

最新新闻

飞控计算机硬实时系统设计:RTOS选型、任务调度与验证实践

飞控计算机硬实时系统设计:RTOS选型、任务调度与验证实践

1. 为什么飞控计算机必须用“硬实时”系统干飞控嵌入式这行的人,几乎每天都要跟“硬实时”这三个字打交道。飞控计算机(Flight Control Computer, FCC)是所有飞行器的大脑,它要接收陀螺、加速度计、气压计、GNSS、空速管这些传感器…

2026/10/12 10:50:52 阅读更多 →
ESP32本地工作台搭建:固件管理与串口调试实战

ESP32本地工作台搭建:固件管理与串口调试实战

搭建一个“本地工作台”这事儿,一开始我也觉得是给自己找事。SDK 摆在那儿,文档、示例、编译脚本、烧录工具一应俱全,理论上不该缺什么。可真到了维护一个 ESP32 应用平台、手里同时有好几块板子、好几个固件版本、还时不时有同事过来说“帮我…

2026/10/12 10:50:52 阅读更多 →
基恩士KV8000+XH16EC远程IO全ST编程实战

基恩士KV8000+XH16EC远程IO全ST编程实战

前阵子给客户做了一套小型自动检测设备,主站选了基恩士KV8000,现场几个工位的输入点通过XH16EC总线从站远程扩展,整个控制程序没有用梯形图,全部用ST(结构化文本)写完。项目不算复杂,但把总线组…

2026/10/12 10:50:52 阅读更多 →
九月开源项目盘点:20个值得细说的新项目与实操踩坑经验

九月开源项目盘点:20个值得细说的新项目与实操踩坑经验

1. 九月开源项目盘点的整体筛选逻辑九月份是开源社区一年中比较特殊的时间节点。北半球的开发者刚从暑期节奏中回归,各大基金会和社区开始为年底的版本发布做冲刺,很多团队会选择在这个窗口期把积攒了大半年的重构成果正式开源。我每年九月都会花几个晚上…

2026/10/12 10:50:52 阅读更多 →
基于CWnd自绘CListCtrl:双缓冲、滚动条与命中测试全解析

基于CWnd自绘CListCtrl:双缓冲、滚动条与命中测试全解析

搞Windows桌面客户端的兄弟,应该都体会过原生CListCtrl的憋屈:行高锁死、列头丑、样式改不动、数据一多滚动还闪屏。以前接了个项目要做深色主题,UI稿上手一看,原生控件根本没法看,最后只能走上自绘这条路。这篇就把我…

2026/10/12 10:50:52 阅读更多 →
AI Agent 记忆系统架构实战:TaoToken 统一 Key 打通短期与长期记忆链路

AI Agent 记忆系统架构实战:TaoToken 统一 Key 打通短期与长期记忆链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 10:49:51 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →