为什么要将原始数据从bufPtr复制到data中

 if (memcpy_s(data + DWORD_SERIALIZE_SIZE, sizeNewBuf - DWORD_SERIALIZE_SIZE, bufPtr, size)) {delete[] data;return;} 

将原始数据从bufPtr复制到data中是为了构建一个完整的待发送数据包,其中包含了额外的头部信息(如数据大小),并确保数据包在内存中连续存放,便于后续一次性发送。这样做的原因如下:

  1. 添加头部信息: 函数首先在data的前四个字节中存储了数据大小(以网络字节序),即DWORD_SERIALIZE_SIZE个字节。这意味着原始数据不能直接放置在data的起始位置,需要从data + DWORD_SERIALIZE_SIZE开始存放。

  2. 保证数据连续性: 网络通信通常要求发送的数据是连续的内存区域。将原始数据复制到data中,确保了待发送数据(包括头部信息和原始数据)在内存中是连续的,可以直接通过一次系统调用或API函数(如writesend或相关库函数)发送出去,提高了效率。

  3. 方便发送: 函数后续调用Base::SendToStreamEx发送数据时,只需传递datasizeNewBuf作为参数。这样,发送函数无需关心原始数据的位置、大小以及如何与头部信息合并,简化了发送逻辑。

  4. 内存管理data是由函数动态分配的,其生命周期受控于函数内部。将原始数据复制到data中,可以确保即使原始数据所在的内存区域在发送完成后被释放或重用,待发送数据包依然有效。此外,如果发生错误,只需释放data即可,无需考虑原始数据的清理问题。

  5. 一致性与封装: 这种做法将数据打包(包括添加头部信息、复制数据等)的过程封装在SendChannel函数内部,对外部调用者透明。外部调用者只需提供原始数据和大小,由SendChannel函数负责处理所有与发送相关的细节,保持了代码的模块化和职责分离。

综上所述,将原始数据从bufPtr复制到data中是为了构建一个包含额外头部信息且内存连续的待发送数据包,便于高效发送,并简化了内存管理、错误处理和代码结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/823116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第3期】PMC对话标杆用户:兆原数通在SeaTunnel的应用实践

📣随着技术快速发展,企业对数据系统的现代化改造需求日益增加。在这种背景下,如何在保持业务连续性的同时,实现数据系统的平滑迁移与升级呢?加入我们的本期技术访谈节目,来听听李洪军老师分享他们如何利用S…

算法题解记录11+++从前序与中序遍历序列构造二叉树(百日筑基)

题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,…

树莓派驱动开发--iic篇(JY901S陀螺仪的三轴角度简单读取)

前言:既然大家都到了这步,想必对驱动开发有着一定的理解啦吧!!那我在前面说一下流程: 修改编译设备树》》》编写编译驱动文件》》》编写编译app文件》》》ftp挂载将前面3复制到树莓派的对应位置》》》加载驱动模块》》…

2024软件测试自动化框架都有哪些?

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐,必须加快应用程序的交付时间,但不能以牺牲质量为代价。快速实现质量是必要的,因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类(把行为接口作为类成员)2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C(用到了大量C2.0的知识&…

linux nohup命令启动jar包 如何取消nohup日志打印

你好,如果你想在使用nohup启动jar包时不输出日志,可以将标准输出和标准错误重定向到/dev/null,这样日志就不会显示在终端上了。你可以这样做: 日志目录指向/dev/null系统空文件,不可改其他路径必须dev nohup java -ja…

数据库SQL语言实战(三)

删除操作 本篇文章重点在于SQL中的各种删除操作 题目一 删除表中的学号不全是数字的那些错误数据,学号应该是数字组成,不能够包含字母空格等非数字字符。方法之一:用substr函数,例如Substr(sid,1,1)返回学号的第一位&#xff0…

Claude3与GPT4全面对比

Claude 3是由人工智能公司Anthropic推出的最新大语言模型,一经推出就在学术界和普通用户中引起轰动。Claude 3在逻辑推理、数学、编程、多语言理解和视觉等方面表现出色,被认为全面超越了此前的GPT-4模型。一些用户甚至认为Claude 3展现出了自我意识的迹象,但专家们对此持怀疑态…

C++常考面试题(第二篇)

【题目 16】拷贝构造函数的格式和作用,自动调用拷贝构造函数的几种情形? 格式:没有返回值 函数名和类名相同 参数:const person& 类型引用 作用:逐个给成员变量进行赋值三种情形下会调用拷贝构造函数 (1) 当用一…

Zynq学习笔记--AXI 总线仿真(AXI VIP)

目录 1. 概述 2. Simulation with AXI VIP 2.1 axi_vip_pkg 2.2 design_1_axi_vip_0_0_pkg 2.3 参数指定 3. 实例化注意事项 3.1 名称对应关系 3.2 寄存器地址 3.3 block design 1. 概述 AXI Verification IP(AXI VIP)是一种用于验证AXI总线协议的…

ubuntu配置springboot+vue环境

ubuntu 22.04 配置springbootvuenginx(出码生成)项目环境 准备工作:VMware 系统镜像:ubuntu-22.04.1-live-server-amd64.iso 一、jdk-1.8环境配置 sudo apt-get install openjdk-8-jdk #查看安装版本 java -version安装失败出现以下问题,更…

09 SQL进阶 -- SQL高级处理 -- 窗口函数等

1. 窗口函数 1.1 窗口函数概念及基本的使用方法 窗口函数也称为 OLAP 函数。OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。 为了便于理解,称之为窗口函数。常规的 SELECT 语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某…

Spring @Transactional 注解

官方文档:https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html#:~:textThe%20%40Transactional%20annotation%20is%20metadata,suspending%20any%20existing%20transaction%22). 推荐阅读:https:…

基于springboot实现大创管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现大创管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足,创建了一个计算机管理大创管理系统的方案。文章介…

c++ filesystem::path 和string类型相互转化

在 C17 中引入了 std::filesystem 标准库,提供了 std::filesystem::path 类型来处理文件路径。你可以使用该库来进行 std::filesystem::path 和 std::string 之间的转换。以下是一些示例代码: 将 std::string 转换为 std::filesystem::path:…

Re65:读论文 GPT-3 Language Models are Few-Shot Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Language Models are Few-Shot Learners ArXiv网址:https://arxiv.org/abs/2005.14165 2020 NeurIPS:https://papers.nips.cc/paper/2020/hash/1457c0d6bfcb49674…

集成sa-token实现登录和RBAC权限控制

集成sa-token实现登录和RBAC权限控制 文章目录 1.sa-token是什么?1.1简介1.2官网1.3 Sa-Token 功能一览1.4 功能结构图 2.集成sa-token及配置2.1 pom依赖2.2 yaml配置2.3 代码配置 4.RBAC权限控制表设计5.菜单权限树构造实现5.1菜单权限数据sql查询5.2菜单权限树构建…

solidity(10)

🔮 Solidity变量指南:探寻状态、局部和全局三界之秘🌌 在Solidity的神秘大陆上,变量就像是散落在时间和空间中的宝石💎,每颗都有它独特的魔力和作用域。掌握这三种变量,是成为合约法师的重要一…

Vue项目学习(一)-SQL闯关

Hello , 我是小恒不会java。今天来阅读一个Vue纯前端项目--SQL在线闯关 进步的方法除了文档书籍视频,学会阅读源代码,从代码中学会解决需求的方法也是必要的 已部署完成,在线体验:http://sql.yunduanjianzhan.cn 背景 简介 闯…

monogoTemplate 将 JSON{key1: 1, key2:2, key3:[{},{}{}]} 中key3 中的数组元素提取出来作为新的文档

问题描述 monogoTemplate 将 JSON{key1: 1, key2:2, key3:[{},{}{}]} 中key3 中的数组元素提取出来作为新的文档 // 创建聚合操作 Aggregation agg Aggregation.newAggregation(Aggregation.match(Criteria.where("YOUR_FILTER_FIELD").is(YOUR_VALUE)), // 过滤条…