程序设计:C++ 一个可以放入共享内存的string模板
共享内存由于是多进程共享的,里面的数据不适合包含指针,因为共享内存在不同进程里的地址并不相同。尽管可以在连接共享内存时指定连接地址,但是,这样做限制太多:
- 不同硬件、系统这个地址可能不一样,没有通用性
- 动态挂载、卸载不能保证地址可用,从而只能在进程加载时尽早连接共享内存
- 不同的使用共享内存的组件存在冲突可能,导致地址不可用
因此坚持由系统分配连接地址是合理的。这样,就要求共享内存里的数据不包含指针,通常我们都选择只使用简单结构,但是即使是简单结构,我们也可以尽量包装一下,方便使用。
这里就是一个字符串的模板sstring<int>,用来替代sstring。设计思想很简单,就是个定长数组,提供类似string的操作。
这个代码在sstring后面还包含了两个运算符重载,用来支持>>和<<。
代码是用于unix/linux的。
#include <cstring>
#include <string>//定长字符数组模板,共享内存不能用string,char[]又不安全
template <long BUFSIZE >
class sstring
{
private:char data[BUFSIZE];static void _copydata(char * buf, char const * source){buf[BUFSIZE - 1] = '\0';long i = 0;for (; i < BUFSIZE - 1; ++i){buf[i] = source[i];if ('\0' == source[i])break;}for (; i < BUFSIZE - 1; ++i){buf[i] = '\0';}}
public:sstring() { memset(data, 0, BUFSIZE); }~sstring() { memset(data, 0, BUFSIZE); }sstring(sstring const & tmp) { _copydata(data, tmp.data); }sstring(char const * psz) { _copydata(data, psz); }sstring(std::string const & str) { _copydata(data, str.c_str()); }sstring & operator=(sstring const & tmp) { _copydata(data, tmp.data); return *this; }sstring & operator=(char const * psz) { _copydata(data, psz); return *this; }sstring & operator=(std::string const & tmp) { _copydata(data, tmp.c_str()); return *this; }long size()const { return strlen(data); }char const * c_str()const { return data; }char const & operator [](long off)const { return data[off]; }bool operator == (char const * tmp)const { return 0 == strcmp(data, tmp); }bool operator == (sstring const & tmp)const { return 0 == strcmp(data, tmp.data); }bool operator == (std::string const & tmp)const { return 0 == strcmp(data, tmp.c_str()); }bool operator != (char const * tmp)const { return 0 != strcmp(data, tmp); }bool operator != (sstring const & tmp)const { return 0 != strcmp(data, tmp.data); }bool operator != (std::string const & tmp)const { return 0 != strcmp(data, tmp.c_str()); }bool operator < (char const * tmp)const { return 0 > strcmp(data, tmp); }bool operator < (sstring const & tmp)const { return 0 > strcmp(data, tmp.data); }bool operator < (std::string const & tmp)const { return 0 > strcmp(data, tmp.c_str()); }bool operator <= (char const * tmp)const { return 0 >= strcmp(data, tmp); }bool operator <= (sstring const & tmp)const { return 0 >= strcmp(data, tmp.data); }bool operator <= (std::string const & tmp)const { return 0 >= strcmp(data, tmp.c_str()); }bool operator > (char const * tmp)const { return 0 < strcmp(data, tmp); }bool operator > (sstring const & tmp)const { return 0 < strcmp(data, tmp.data); }bool operator > (std::string const & tmp)const { return 0 < strcmp(data, tmp.c_str()); }bool operator >= (char const * tmp)const { return 0 <= strcmp(data, tmp); }bool operator >= (sstring const & tmp)const { return 0 <= strcmp(data, tmp.data); }bool operator >= (std::string const & tmp)const { return 0 <= strcmp(data, tmp.c_str()); }
};template <long BUFSIZE >
inline std::ostream& operator <<(std::ostream & out, sstring<BUFSIZE> const & data)
{out << data.c_str();return out;
}template <long BUFSIZE >
inline std::istream & operator >>(std::istream & in, sstring<BUFSIZE> & data)
{std::string tmp;in >> tmp;data = tmp;return in;
}
这个代码在我的共享内存体系里是个基础对象,广泛使用。
(这里是结束)
相关文章:
程序设计:C++ 一个可以放入共享内存的string模板
共享内存由于是多进程共享的,里面的数据不适合包含指针,因为共享内存在不同进程里的地址并不相同。尽管可以在连接共享内存时指定连接地址,但是,这样做限制太多: 不同硬件、系统这个地址可能不一样,没有通…...
【EI会议征稿】第三届应用力学与先进材料国际学术会议(ICAMAM 2024)
第三届应用力学与先进材料国际学术会议(ICAMAM 2024) 2024 3rd International Conference on Applied Mechanics and Advanced Materials(ICAMAM 2024) 第三届应用力学与先进材料国际学术会议(ICAMAM 2024)…...
Python -- I/O编程
文章目录 一、文件读写1. 读文件2. 二进制文件3. 字符编码4. 写文件 二、StringIO和BytesIO三、操作文件和目录1. 操作系统命令2. 操作文件 四、序列化五、 JSON六、异步IO1. 协程2. asyncioasync/awaitaiohttp 一、文件读写 Python内置了读写文件的函数,用法和C是…...
langchain入门指南和实战
简单介绍 LangChain 是一个开源的语言模型集成框架,旨在简化使用大型语言模型(LLM)创建应用程序的过程。 利用它可以让开发者使用语言模型来实现各种复杂的任务,例如文本到图像的生成、文档问答、聊天机器人、 调用特定的SaaS服务…...
群晖synology DSM 7.2设置钉钉Webhooks通知
现在越来越多的小伙伴都有了自己的Nas系统,为了更加方便的接收Nas的消息,这篇文章带着大家一起配置一个钉钉(机器人)即时消息通知 首先登录钉钉的开放平台:开发者后台统一登录 - 钉钉统一身份认证 1.创建一个机器人&…...
STP生成树协议详解
一、STP作用 如果链路断开或节点故障,那么互联的设备就无法正常通信了,这类网络问题叫做单点故障。没有备份的链路或节点,出现故障会直接断网。如果要提供 724 小时不间断的服务,那就需要在网络中提前部署冗余。避免出现单点故障…...
CentOS 6/7/8 操作系统镜像下载
CentOS Mirrors List 编辑 DownloadAbout About CentOS Frequently Asked Questions (FAQs) Special Interest Groups (SIGs) CentOS Variants Governance Community Contribute Forums Mailing Lists IRC Calendar & IRC Meeting List Planet Submit a Bug Stories Doc…...
中国社科院与美国杜兰大学金融管理硕士---不将就的人生
“万般皆下品,惟有读书高”、“书中自有颜如玉,书中自有黄金屋”,古往今来,读书的好处为人们所重视。从而想拿到学历没有知识的沉淀,没有一定的学识水平,又怎么能拿到含金量颇高的学历呢?退一步…...
教程更新 | 持续开源 RK3568驱动指南-驱动基础进阶篇
《iTOP-RK3568开发板驱动开发指南》手册文档更新,手册内容对应视频教程,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 ✦ 第一篇 驱动基础 第1章 前言 第2章 你好!内核源码 第3章 …...
Jmeter测试关联接口
Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,本文主要介绍jmeter通过正则表达式提取器来实现接口关联的方式,可供参考。 一、实例场景: 有如下两个接口,通过正则表达式提取器,将第一…...
C++之基于Winsock2封装UDPServer与UDPClient
文章目录 Socket过程UDPServer.hUDPServer.cppUDPClient.hUDPClient.cppmain.cppCMakeLists.txt测试截图 Socket过程 UDPServer UDPClient UDPServer.h #ifndef UDPSERVER_H_INCLUDED #define UDPSERVER_H_INCLUDED#include <iostream> #include <string> #inclu…...
为什么说指针是c语言的灵魂?
为什么说指针是c语言的灵魂? 语言主要操作的对象是数据,c语言里面能够有大容量数据的地方就是指针指向的heap内存。从这 个角度来看,确实指针就是数据的灵魂。最近很多小伙伴找我,说想要一些c语言资料,然后我根据自己…...
性能测试jmeter命令行运行+html测试报告解读
windows下打开jmeter的运行窗口,可以看到提示不要用GUI模式进行负载测试,如果要用负载测试,用cli模式,因为GUI模式运行jmeter比较消耗性能。 命令行模式 windows下找到jemeter所在文件夹,打开cmd输入命令。 jmeter -n…...
Service Mesh和Kubernetes:加强微服务的通信与安全性
文章目录 什么是Service Mesh?Service Mesh的优势1. 流量控制2. 安全性3. 可观测性 Istio:Service Mesh的领军者流量管理安全性可观测性 Linkerd:轻量级Service Mesh流量管理安全性可观测性 Istio vs. Linkerd实际应用结论 🎈个人…...
『吴秋霖赠书活动 | 第三期』《Python asyncio并发编程》
文章目录 1. 写在前面2. 浅谈asyncio3. Python asyncio并发编程 不再受限于!asyncio异步让你的程序在高并发时翱翔自如! 声明:赠书活动是博主与出版社达成合作,只属于粉丝的专属福利 本期书籍:《Python asyncio并发编程…...
数字孪生在工厂领域的应用和优势
工厂运营一直以来都是高度复杂且信息密集的任务。然而,随着数字孪生技术的出现,工厂领域正在经历一场前所未有的革命。本文将介绍数字孪生在工厂领域的应用,以及它如何重新定义了制造业的运营方式。 什么是数字孪生? 数字孪生是…...
如何写代码实现VRP问题中车辆容量限制及时间窗要求(python)
问题研究背景 使用遗传模拟退火算法求解如下10个卸货点的VRPTW问题。为了使研究的问题更加有意义,本人将时间限理解为服务点一天的具体可以允许配送的时间。 如果不要求车辆从配送中心出发的时间是统一的并且为0时刻,那么就默认第一个配送节点是一定能赶…...
C语言求解汉诺塔问题
完整代码: /*Hanoi(汉诺)塔问题。这是一个古典的数学问题:古代有一个梵塔,塔内有 3 个 座 A,B,C,开始时 A 座上有 64 个盘子,盘子大小不等,大的在下,小的在上。有一个老…...
安装LSF
安装需求 基本硬件配置建议: CPU 4核或以上(LSF 没有最低 CPU 需求,此处只是建议)内存 8G或以上( 当没有作业在运行时, Linux x86-64 上集群中的 LSF 守护程序将使用大约 488 MB 内存。)交换…...
百度的新想象力在哪?
理解中国大模型,百度是一个窗口。这个窗口的特殊性不仅在于变化本身,而是在于百度本身就是那个窗口。 作者|皮爷 出品|产业家 沿着首钢园北区向西北步行10分钟,就能看到一个高约90米的大跳台,在工业园钢铁痕迹的印衬下&#…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...
Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...
