程序设计:C++ 一个可以放入共享内存的string模板

共享内存由于是多进程共享的,里面的数据不适合包含指针,因为共享内存在不同进程里的地址并不相同。尽管可以在连接共享内存时指定连接地址,但是,这样做限制太多:

  • 不同硬件、系统这个地址可能不一样,没有通用性
  • 动态挂载、卸载不能保证地址可用,从而只能在进程加载时尽早连接共享内存
  • 不同的使用共享内存的组件存在冲突可能,导致地址不可用

因此坚持由系统分配连接地址是合理的。这样,就要求共享内存里的数据不包含指针,通常我们都选择只使用简单结构,但是即使是简单结构,我们也可以尽量包装一下,方便使用。

这里就是一个字符串的模板sstring<int>,用来替代sstring。设计思想很简单,就是个定长数组,提供类似string的操作。

这个代码在sstring后面还包含了两个运算符重载,用来支持>>和<<。

代码是用于unix/linux的。

cpp 复制代码
#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;
}

这个代码在我的共享内存体系里是个基础对象,广泛使用。

(这里是结束)

相关推荐
2601_9561219717 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-19 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场21 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑21 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶21 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ1 天前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海1 天前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu1231 天前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
June`1 天前
warp shuffle指令
c++·人工智能·算法·cuda
乱七八糟的屋子1 天前
【C++数值计算】NumCpp超详细入门教程(纯正Numpy语法、零学习成本、C++首选科学计算库、性能压测对比)
c++·数值计算·numpy·高性能计算·科学计算·ndarray