当前位置: 首页 > article >正文

服务器设计细节 之 【缓冲区模块】(memXXX接口、std::cpoy)

目录2.实现思想2.4.简单实现3.memXXX接口3.1.memcpy — 内存拷贝3.2.memmove — 内存移动3.3.memset — 内存填充3.4.memchr — 内存查找3.5.memcmp — 内存比较4.std::copy -- 范围拷贝1.模块概述Buffer 模块是一个基于线性内存空间的缓冲区组件用于临时存储数据和按序取出数据它通过读写偏移量机制避免了频繁的数据搬移同时能够自动处理空间不足的情况2.实现思想2.1.内存模型采用 std::vectorchar 作为底层内存空间其内部是一块连续的线性内存string不能够处理\0所以不采用2.2.缓冲区核心要素要素说明默认空间大小缓冲区初始容量默认为 1024 字节读偏移量_reader_idx标记当前读取位置的相对偏移量写偏移量_writer_idx标记当前写入位置的相对偏移量偏移量是相对于缓冲区起始地址的相对值而非绝对内存地址2.3.数据操作思想1写入数据流程从当前写偏移位置开始写入检查尾部空闲空间是否足够足够直接写入不足检查总空闲空间尾部 头部是否足够(足够将现有数据搬移到缓冲区起始位置整理碎片空间不足对缓冲区进行扩容)写入成功后写偏移量向后移动2读取数据流程从当前读偏移位置开始读取可读数据大小 写偏移量 - 读偏移量读取后读偏移量向后移动2.4.简单实现#include vector #include cstdint #include cassert #include algorithm #include string #include cstring #define BUFFER_DEFAULT_SIZE 1024 class Buffer { private: std::vectorchar _buffer;//缓冲区 uint64_t _reader_idx; //读偏移 uint64_t _writer_idx; //写偏移 public: Buffer():_reader_idx(0), _writer_idx(0), _buffer(BUFFER_DEFAULT_SIZE){} char* Begin(){ return *_buffer.begin(); } //获取当前写入起始地址 char* WritePosition() { return Begin() _writer_idx; } //获取当前读取起始地址 char* ReadPosition() { return Begin() _reader_idx; } //获取末尾空间大小---写偏移之后的空间大小 uint64_t TailIdleSize() { return _buffer.size() - _writer_idx; } //获取头部空间大小---读偏移之前的空间大小 uint64_t FrontIdleSize() { return _reader_idx; } //获取可读数据大小 前闭后开 uint64_t ReadableSize() { return _writer_idx - _reader_idx; } //读偏移向后移动 void MoveReadOffset(uint64_t len) { assert(len ReadableSize()); _reader_idx len; } //写偏移向后移动 void MoveWriteOffset(uint64_t len) { assert(len TailIdleSize()); _writer_idx len; } //扩容逻辑确保写空间足够 void EnsureWriteSpace(uint64_t len) { // 情况1尾部空间足够直接返回 if (len TailIdleSize()) { return; } uint64_t readable ReadableSize(); // 情况2尾部空间不足但总空闲空间足够需要整理碎片 if (len TailIdleSize() FrontIdleSize()) { // 将可读数据移动到缓冲区起始位置 std::memmove(Begin(), ReadPosition(), readable); _reader_idx 0; _writer_idx readable; } // 情况3总空闲空间也不够需要扩容 else { // 先整理碎片到起始位置再扩容 if (_reader_idx 0) { std::memmove(Begin(), ReadPosition(), readable); _reader_idx 0; _writer_idx readable; } // 扩容到至少能容纳 (readable len) 字节 _buffer.resize(readable len); } } //写入数据 void Write(const void* data, uint64_t len) { EnsureWriteSpace(len); const char* d (const char*)data; std::copy(d, d len, WritePosition()); } //移动偏移量 void WriteAndPush(const void* buf, uint64_t len) { Write(buf, len); MoveWriteOffset(len); } //复用逻辑 void WriteString(const std::string data) { Write(data.c_str(), data.size()); } void WriteStringAndPush(const std::string data) { WriteString(data); MoveWriteOffset(data.size()); } void WriteBuffer(Buffer data) { Write(data.ReadPosition(), data.ReadableSize()); } void WriteBufferAndPush(Buffer data) { WriteBuffer(data); MoveWriteOffset(data.ReadableSize()); } //读取数据 void Read(void* buffer, uint64_t len) { assert(len ReadableSize()); std::copy(ReadPosition(), ReadPosition() len, (char*)buffer); } //移动偏移量 void ReadAndPop(void* buf, uint64_t len) { Read(buf, len); MoveReadOffset(len); } //强调复用逻辑 std::string ReadAsString(uint64_t len) { assert(len ReadableSize()); return std::string(ReadPosition(), len); } std::string ReadAsStringAndPop(uint64_t len) { std::string ret ReadAsString(len); MoveReadOffset(len); return ret; } //查找换行符 char* FindCRLF() { char* res (char*)memchr(ReadPosition(), \n, ReadableSize()); return res; } //针对ASCII字符有效 std::string Getline() { char* pos FindCRLF(); if(pos nullptr) return ; return ReadAsString(pos - ReadPosition() 1); } std::string GetlineAndPop() { std::string ret Getline(); MoveReadOffset(ret.size()); return ret; } //清空缓冲区 void Clear() { _writer_idx _reader_idx 0; } };3.memXXX接口3.1.memcpy — 内存拷贝项目说明函数原型void* memcpy(void* dest, const void* src, size_t n);头文件cstring功能从src复制n个字节到dest参数dest: 目标地址src: 源地址n: 拷贝字节数返回值返回dest指针安全性不安全。若dest和src内存重叠行为未定义适用场景两块不重叠内存的拷贝例如缓冲区读写、结构体复制性能极快编译器通常做极致优化示例memcpy(write_pos, data, len);3.2.memmove — 内存移动项目说明函数原型void* memmove(void* dest, const void* src, size_t n);头文件cstring功能从src复制n个字节到dest参数dest: 目标地址src: 源地址n: 拷贝字节数返回值返回dest指针安全性安全。允许dest和src内存重叠内部会判断重叠方向并选择合适拷贝顺序适用场景同一块内存内数据的搬移例如整理碎片、删除中间元素性能略慢于memcpy因为有重叠判断但差距极小示例memmove(buf, buf reader_idx, readable);3.3.memset — 内存填充项目说明函数原型void* memset(void* str, int c, size_t n);头文件cstring功能将str指向内存的前n个字节设置为值c参数str: 目标地址c: 要设置的值以int传入实际转为unsigned charn: 填充字节数返回值返回str指针安全性安全。但需确保n不超出有效内存范围适用场景初始化内存为 0、填充固定值、清除敏感数据性能极快通常会使用 CPU 特殊指令优化示例memset(obj, 0, sizeof(obj));3.4.memchr — 内存查找项目说明函数原型void* memchr(const void* str, int c, size_t n);头文件cstring功能在str指向的前n个字节中查找字符c的首次出现参数str: 搜索起始地址c: 要查找的字符n: 搜索范围字节数返回值找到返回指向该字节的指针未找到返回nullptr安全性安全。不会越界访问超出n的内存适用场景查找分隔符如\n、定位特定标记字节性能线性扫描中等速度。查找大块数据时性能不如专有算法示例memchr(buf read_idx, \n, readable_size);3.5.memcmp — 内存比较项目说明函数原型int memcmp(const void* ptr1, const void* ptr2, size_t n);头文件cstring功能比较ptr1和ptr2指向的前n个字节参数ptr1: 第一块内存ptr2: 第二块内存n: 比较字节数返回值0ptr1小于ptr20相等0ptr1大于ptr2安全性安全。比较前n个字节不会越界适用场景二进制数据比较、检查数据是否相同性能逐字节比较大块数据可考虑先比较首字节或哈希示例memcmp(buf1, buf2, 16);memcpy 本身不会检查边界如果长度不正确就会发生越界导致未定义行为4.std::copy -- 范围拷贝项目说明函数原型templateclass InputIt, class OutputIt OutputIt std::copy(InputIt first, InputIt last, OutputIt d_first);头文件algorithm功能将[first, last)范围内的元素拷贝到以d_first为起点的目标区域参数first: 源范围起始迭代器last: 源范围结束迭代器不包含d_first: 目标范围起始迭代器返回值指向目标范围最后一个被拷贝元素的下一个位置的迭代器底层实现对平凡可复制类型如char编译器通常会优化为memmove安全性若目标范围与源范围重叠且d_first在[first, last)内行为未定义类型安全编译期检查无需手动计算字节数自动推导类型大小泛型支持适用于任何满足输入/输出迭代器概念的类型不仅限于char*适用场景C 风格代码泛型编程非平凡类型对象的拷贝性能平凡类型与memmove相当非平凡类型触发赋值运算符可能较慢示例std::copy(d, d len, WritePosition());

相关文章:

服务器设计细节 之 【缓冲区模块】(memXXX接口、std::cpoy)

目录 2.实现思想 2.4.简单实现 3.memXXX接口 3.1.memcpy — 内存拷贝 3.2.memmove — 内存移动 3.3.memset — 内存填充 3.4.memchr — 内存查找 3.5.memcmp — 内存比较 4.std::copy -- 范围拷贝 1.模块概述 Buffer 模块是一个基于线性内存空间的缓冲区组件&#xff…...

阅读 String 源代码之后的收获

在学习 Java 的过程中,String 是最常用的类之一。表面上看,它只是一个保存字符串的对象,但阅读部分源代码后,我发现它背后其实有很多值得学习的设计思想。 1. String 是不可变的 这是我阅读源代码后最深刻的认识之一。 在日常编程…...

AI Agent Harness Engineering 成本与收益的真相:企业投入产出比全景分析与 ROI 计算方法论

AI Agent Harness Engineering 成本与收益的真相:企业投入产出比全景分析与 ROI 计算方法论副标题:从盲目跟风到数据驱动决策——拆解百万到十亿级Agent项目的真实投入、可量化收益与可持续增长模型第一部分:引言与基础 (Introduction & …...

【限时开源】企业级AI沙箱框架v1.0发布:支持自动策略生成、实时syscall拦截、GPU设备级隔离——仅开放前500名开发者申请白名单

更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术 实战案例 在 AI 模型快速迭代与第三方代码频繁集成的场景下,运行不可信推理脚本存在严重安全风险。Docker Sandbox 提供轻量级、强隔离的容器化执行环…...

【AI大模型】国内外主流大语言模型(LLM)全面对比解析

目录 一、国际主流大语言模型(LLM)详解 1. GPT-4o(OpenAI)—— 全能型旗舰标杆 2. Claude 3系列(Anthropic)—— 安全合规与长文本专家 3. Llama 3(Meta)—— 开源界的性能黑马 …...

Cursor Pro永久免费使用终极指南:3步解锁AI编程助手完整功能

Cursor Pro永久免费使用终极指南:3步解锁AI编程助手完整功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached yo…...

14万+下载量!为什么Tavily Search是OpenClaw必装的第一技能?

没有它,你的AI Agent就是"瞎子" 一、先问一个问题 你用过ChatGPT吗? 那你一定遇到过这种情况:问它"2026年最新AI趋势",它告诉你"我的知识截止到2024年4月"。 这就是大模型的先天缺陷——知识有截…...

设备预测性维护在物联网中的技术革新与应用实践

物联网技术的快速发展为工业设备管理带来了革命性变化,预测性维护(Predictive Maintenance, PdM)作为其核心应用之一,正在改变传统被动维修模式。通过实时数据采集、智能分析和故障预警,企业能够显著降低停机时间与维护…...

终极IDM激活方案:开源脚本实现永久免费使用的完整指南

终极IDM激活方案:开源脚本实现永久免费使用的完整指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 想要永久免费使用Internet Download Manager&a…...

VLOOKUP到XLOOKUP的正确打开方式

先说结论VLOOKUP是Excel里被用得最多也被骂得最多的函数,而XLOOKUP是它的全面升级版,能解决VLOOKUP几乎所有的痛点。如果你还在用VLOOKUP,是时候认识XLOOKUP了。这个东西是什么你一定遇到过这种场景,两张表,一张是员工…...

VSCode-reinstall-remote-extension备份重装vscodeextension

远端vscode环境出现莫名其妙卡顿频繁重启,根据重装解决99%问题定律的原则,决定删除vscode-server重装。但是机器上,随着时间推移,vscode安装了n多extension,一时之间难以取舍。那就先备份再重装吧,好在code…...

解密OpenHand机械手:从实验室原型到工业级抓取系统的实战演进

解密OpenHand机械手:从实验室原型到工业级抓取系统的实战演进 【免费下载链接】openhand-hardware CAD files for the OpenHand hand designs 项目地址: https://gitcode.com/gh_mirrors/op/openhand-hardware 面对机器人抓取任务中的自适应挑战,…...

终极明日方舟自动化助手:5分钟快速上手MAA完整指南

终极明日方舟自动化助手:5分钟快速上手MAA完整指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcod…...

BiliRoamingX:解锁B站完整观影体验的3大核心解决方案

BiliRoamingX:解锁B站完整观影体验的3大核心解决方案 【免费下载链接】BiliRoamingX-integrations BiliRoamingX integrations and patches powered by ReVanced. 项目地址: https://gitcode.com/gh_mirrors/bi/BiliRoamingX-integrations 你是否曾因地区限制…...

仰望U8真牛,老戏骨都忍不住夸

2026北京车展看点还真不少!王志飞和宁理两位老师,特意来到仰望展台体验了仰望U8。两人亲自坐进车里,体验了车内空间和智能配置,整体体验下来评价都很不错。王志飞分享说,仰望U8车内静谧性很好,行驶起来特别…...

C 语言控制流完全指南

在 C 语言编程中,控制流是程序的核心骨架,决定了代码的执行顺序与逻辑分支。本文将系统讲解 C 语言中的分支、循环、跳转语句,帮你彻底掌握程序控制的核心技巧。一、二路分支:if 与 if-else逻辑:程序中某段代码需要在满…...

100人以内中小工厂ERP怎么选?好用不贵的系统看这里

很多几十人到百人的中小工厂,都面临同样的管理难题: 库存不准,盘点麻烦,积压浪费多 生产进度不透明,天天追着车间问 订单易出错,漏单错发时有发生 财务对账慢,成本利润算不清 想用系统又怕&…...

卡梅德生物技术快报|探针定制:媒介探针 qPCR 体系原理、设计规范与工程化实现

摘要本文聚焦基于媒介探针的 qPCR 定制体系,详解探针定制的技术原理、序列设计、体系优化、工程化要点与性能验证方法,提供可直接落地的实验方案与参数配置,面向生物信息、分子诊断、实验开发工程师,助力快速搭建高性能、低成本的…...

2025届毕业生推荐的六大AI辅助论文网站推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek DeepSeek系列论文,系统讲解了混合专家模型也就是MoE与多头潜在注意力即MLA机制的…...

2026年Hermes Agent/OpenClaw如何部署?常见问题解答

2026年Hermes Agent/OpenClaw如何部署?常见问题解答。OpenClaw和Hermes Agent是什么?OpenClaw和Hermes Agent怎么部署?如何部署OpenClaw/Hermes Agent?2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑吗?别再瞎…...

如何快速批量下载ASMR音频资源:asmr-downloader完整使用指南

如何快速批量下载ASMR音频资源:asmr-downloader完整使用指南 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 如果你是一位ASMR爱好…...

BES2800BP_nuttx编译环境搭建方法

1BES2800BP_nuttx编译环境搭建方法0开发环境搭建先安装WSL执行指令指令1: sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev xxd git gperf automake libtool pkg-config build-essential gperf genromfsv libmpc-dev libmpfr-dev li…...

基于MCP协议为AI助手构建持久记忆层:Reattend配置与实战指南

1. 项目概述:为AI助手构建持久记忆层 如果你和我一样,每天都要和Claude、Cursor这类AI助手打交道,那你一定对下面这个场景深恶痛绝:每次打开一个新的对话窗口,AI都像一张白纸,你得把项目背景、技术决策、会…...

如何5分钟搞定Steam清单下载?Onekey免费工具终极指南

如何5分钟搞定Steam清单下载?Onekey免费工具终极指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是不是曾经为了获取Steam游戏的Depot清单而头疼?那些复杂的API调用…...

GEO 实战教程:企业生成式引擎优化的完整实现方案

生成式引擎优化(GEO)正在成为企业获取 AI 搜索流量的核心技术。本文将从工程实现的角度,讲解如何从零构建企业的 GEO 体系。一、GEO 技术架构总览GEO 的核心技术栈包含三个层面:语料采集层、知识处理层、内容优化层。语料采集层负…...

Winhance中文版:三分钟让你的Windows系统焕然一新

Winhance中文版:三分钟让你的Windows系统焕然一新 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

告别软件SPI!用STM32硬件SPI+DMA刷新中景园ST7789,释放CPU性能实测

STM32硬件SPIDMA驱动ST7789屏幕实战:性能优化全解析 对于嵌入式开发者而言,显示性能往往是系统瓶颈之一。当我在一个需要实时显示心电图波形的医疗设备项目中使用软件SPI驱动ST7789屏幕时,发现CPU占用率高达70%,这直接影响了其他关…...

终极指南:用AntimicroX免费解决游戏手柄兼容问题

终极指南:用AntimicroX免费解决游戏手柄兼容问题 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/GitHub_Tre…...

别再问Go有没有char了!一文搞懂byte、rune和单引号字符串的实战区别

别再问Go有没有char了!一文搞懂byte、rune和单引号字符串的实战区别 每次看到Go新手在群里问"为什么Go没有char类型",我就想起自己当年被C语言思维支配的恐惧。作为一个从Java/C转Go的老兵,我完全理解这种困惑——毕竟在其他语言里…...

【2026 Docker AI Toolkit实战白皮书】:从本地PoC到万卡集群推理的7步标准化交付流程

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026 核心架构演进与版本特性概览 Docker AI Toolkit 2026 是面向生成式AI工作流深度优化的容器化开发平台,其核心架构从单体引擎全面转向“可插拔编排层 智能运行时沙箱…...