程序设计: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;
}

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

(这里是结束)

相关推荐
黑不拉几的小白兔35 分钟前
PTA部分题目C++重练
开发语言·c++·算法
写bug的小屁孩37 分钟前
websocket身份验证
开发语言·网络·c++·qt·websocket·网络协议·qt6.3
chordful1 小时前
Leetcode热题100-32 最长有效括号
c++·算法·leetcode·动态规划
材料苦逼不会梦到计算机白富美1 小时前
线性DP 区间DP C++
开发语言·c++·动态规划
ahadee1 小时前
蓝桥杯每日真题 - 第12天
c++·vscode·算法·蓝桥杯
vortex52 小时前
解决 VSCode 中 C/C++ 编码乱码问题的两种方法
c语言·c++·vscode
醉颜凉4 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
hunandede4 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
爱学习的大牛1234 小时前
通过vmware虚拟机安装和调试编译好的 ReactOS
c++·windows内核
tumu_C5 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源