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

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

(这里是结束)

相关推荐
sulikey20 分钟前
C++类和对象(下):初始化列表、static、友元、内部类等核心特性详解
c++·static·初始化列表·友元·匿名对象·内部类·编译器优化
oioihoii1 小时前
C++网络编程:从Socket混乱到优雅Reactor的蜕变之路
开发语言·网络·c++
笨鸟要努力2 小时前
Qt C++ windows 设置系统时间
c++·windows·qt
神仙别闹2 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法
AA陈超5 小时前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
xlq223225 小时前
22.多态(下)
开发语言·c++·算法
不会c嘎嘎6 小时前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
AKDreamer_HeXY7 小时前
ABC434E 题解
c++·算法·图论·atcoder
罗湖老棍子7 小时前
完全背包 vs 多重背包的优化逻辑
c++·算法·动态规划·背包
potato_may7 小时前
C++ 发展简史与核心语法入门
开发语言·c++·算法