跟我学C++中级篇——通信的数据的传递形式

一、通信的数据传递

在开发程序中,无可避免的会进行数据的传递。这种传递方式有很多种,字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时,如何正确的采用更合适的方法,就成为了一个设计的首选的问题。

二、数据传递形式选择的原则

在面对复杂的应用场景和多种多样的传递方式的前提下,如何正确的确定自己的通信传递形式,是有一些原则可以参考的:
1、准确性
这是选择的首要原则,即准确,不能因为因为选择一种方式导致过多的中间环节产生问题。最简单的一种例子就是在函数参数的通信中,把有符号和无符号互相传递,这极有可能出现问题,而且不容易发现。另外,不能让开发者产生歧义,这也是准确性的一种表现即表义要准确。
2、简单性
在准确的基础上,用最少的工作量即可实现最为可取。这种简单不只是普通的简单,如果有成熟的框架或者有现成的库、类等,也称之为简单。

3、可扩展性
也就是灵活性,最好这种数据传递起来不会因为一个轻微的新需求,导致很复杂或很大量的修改。

4、可维护性
这种其实是前边几种的一种综合要求,一般来说,简单的就容易维护,可扩展性好也容易维护。但又简单又可扩展,就不一定好维护了。比如用了一个现有的框架,那维护性就未必多高。毕竟一个框架还是需要付出较多的人力成本和时间去学习掌握的。

三、数据传递常见的形式

1、函数间
函数间的数据通信是最常见的,一般来说,开发者都会采用基本数据类型(如int,string等)进行数据传递。但这种方式有限制,一个是无法传递太多的参数,另外一个无法传递一些对象或特定的数据类型(如图像等)。
那么就可以使用类或结构体来进行传递,这种方式可以传递多个对象,但编写有些复杂,维护成本有所增加。如果需要传递多个相同的基础类型或对象,可以使用STL中的一些std::array、std::vector、std::list等进行传递。它们很重,而且效率也不多高,操作起来相对直接使用对象或基础数据类型要麻烦一些(此处不讨论值或引用传递,只讨论形式)。
但此时又会出现一些问题,比如有一些数据是有关联的,怎么办?可以使用std::pair,std::tuple或者使用std::map等。这种应用就复杂一些,而且还有不少细节的小坑,如果没有文档辅助可能让后续开发者有些难以入手。
而对于图像或视频、文件这种大的数据类型,可以使用二进制流(可以用指针操作)或者使用json字符串传递(一用不建议使用xml进行传递了)。这就相当麻烦了,除了涉及到数据的流式转换和流的处理外,还得考虑内存的分配等额外的情况。所以就得权衡一下利弊了。
2、进(线)程间
在多进程间,一般来说,函数间的方法都可以使用,但是要注意数据的安全性和生命周期的问题。在早期的程序中,还可以通过强制指针的转换通过二进制字节的方式传递(void*),而大家都知道,强制转换是有风险的。而如果采用内存映射等传递的话基本就是二进制字节流的形式了(很少时候可以看到以文件的形式进行传递数据,其实也是二进流的方式)。
3、库接口间
库接口间通信一般也如上面所述,但需要注意的是,库接口之间可能存在着数据类型不一致的情况,转换的一方要保证转换的准确性。
4、框架间
框架间的通信除了上面所述的情况外,大多使用的是协议,而在协议中,一般普通的数据传递都会采用Json字符串或直接传递参数,但大数据(文件、图像等)都会使用流式传递。
5、分布式通信间
分布式通信好多使用的是序列化,而序列化本质其实也是二进制流通信。二进制流的缺点导致了序列化的出现,即把对象与二进制流间进行正确的互转。同时,序列化的成本相当高。而序列化无论是自己开发还是使用框架都使得维护成本大大增加。

四、总结

杀鸡用牛刀,这是人们常说的大材小用。可还有一句话叫“狮子搏兔”,要尽全力一击。这两个都对,其实就是面对不同的场景下,开发者的选择问题。既要又要还要,那种好事儿谁都想要。结合实际情况,哪个更合适自己,就用哪个。毕竟,有的时候开发程序不单纯是一个技术问题。

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

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

相关文章

C# HandyControl 官方示例 保姆级从0到1搭建学习流程

HandyControl 保姆级从0到1官网示例搭建学习流程 GitHub https://github.com/HandyOrg/HandyControl 技术交流 https://join.slack.com/t/handycontrol/shared_invite/zt-sw29prqd-okFmRlmETdtWhnF7C3foxA 码云 https://gitee.com/handyorg/HandyControl/ 中文文档 http…

矩阵sum,prod函数

s u m sum sum表示求和, p r o d prod prod表示求乘积 s u m sum sum函数 对于矩阵,可以对某一行或某一列求和,也可以对矩阵整体求和 s u m ( a , 1 ) sum(a,1) sum(a,1)计算每一列的和 s u m ( a , 2 ) sum(a,2) sum(a,2)计算每一行的和 计算矩阵整体…

Java—Properties类

Properties类是Java中用于处理属性文件(.properties文件)的类。属性文件是一种简单的文本文件,用于存储键值对数据,常用于保存配置信息。 Properties类继承自Hashtable类,它的键和值都是字符串类型。它提供了一些方法…

TongWeb78处理应用自身JAR包冲突思路

通常应用运行时报错如果出现java.lang.NoClassDefFoundError,那么首先需要看报错日志下方的Caused by内容是什么,如果是ClassNotFoundException,那么原因就是缺少某个类。如果仍然是NoClassDefFoundError,那么很大可能是类冲突导致…

K8S版本和istio版本的对照关系

版本对照关系 下载地址1 下载地址2

Apifox 11月更新|支持发布多个文档站、文档站支持 Algolia 搜索配置、从返回响应直接设置断言

Apifox 新版本上线啦!!! 在API管理和自动化测试的领域,工具的每一次更新,都意味着开发者和测试人员的工作效率将进一步提升。而11月的Apifox更新,再次为我们带来了几个重磅的新功能,助力提升文档…

uniapp App端在renderjs层渲染echarts获取不到service层id的问题

报错信息:Cannot read properties of undefined (reading id) at app-view.js 这样的写法App端有时在renderjs视图层获取不到server逻辑层的数据 server层 renderjs层 解决方法:需要把数据(id)通过server层向renderjs层传值 server层 renderjs层

AI智算-正式上架GPU资源监控概览 Grafana Dashboard

下载链接 https://grafana.com/grafana/dashboards/22424-ai-gpu-20241127/

【Visual Studio Code】--- 连接 SSH 服务器终端 直接开发

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Visual Studio Code】--- 连接 SSH 服务…

2024年首届数证杯 初赛wp

“数证杯”电子数据取证分析大赛致力于成为全国第一大电子数据取证分析大赛,面向所有网络安全从业人员公开征集参赛选手。参赛选手根据所属行业报名参赛赛道,比赛设置冠军、亚军、季军奖。所涉及行业包括能源、金融、通信、取证、安全等企业以及各类司法…

基于智能物联网关的车辆超重AI检测应用

超重超载是严重的交通违法行为,超重超载车辆的交通安全风险极高,像是一颗行走的“不定时炸弹”,威胁着社会公众的安全。但总有一些人受到利益驱使,使超重超载的违法违规行为时有发生。 随着物联网和AI技术的发展,针对预…

计算机网络:IP协议详细讲解

目录 前言 一、IP网段划分 二、IP报头 三、解决IP地址不足-->NAT技术 前言 在之前,我们学习了传输层中的TCP和UDP,重点是TCP协议,他帮我们解决具体到主机的哪个应用(端口)、传输的可靠(序列号、校验和…

信息增强的图像超分辨率重建

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月29日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

【81-90期】Java核心面试问题深度解析:性能优化与高并发设计

🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 文章题目:Java核心面试问题深度解析:性能优化与高并发设计 摘要: 本文聚…

006 MATLAB编程基础

01 M文件 MATLAB输入命令有两种方法: 一是在MATLAB主窗口逐行输入命令,每个命令之间用分号或逗号分隔,每行可包含多个命令。 二是将命令组织成一个命令语句文集,使用扩展名“.m”,称为M文件。它由一系列的命令和语句…

力扣700:二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], val 2 输出:[2,1,3…

两个用来刷新Windows环境变量让会话即时生效的刷新脚本分享

环境变量刷新脚本:RefreshEnv.bat 和 RefreshEnv.ps1 在Windows系统中,环境变量对于程序的正常运行至关重要。当安装新软件或修改系统设置后,环境变量可能会发生变化,但这些变化通常需要重启命令提示符或PowerShell会话才能生效。为了解决这个问题,我们提供了两个脚…

A050-基于spring boot物流管理系统设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

蓝队之云技术

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

openGauss你计算的表大小,有包含toast表么?

openGauss你计算的表大小,有包含toast表么? 最近有一个同事问我说“openGauss中pg_relation_size函数在计算表的大小时是否包含了大字段的大小?”,经过思考后,自己觉得表的大小是不包含大字段的大小的,然后…