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

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

(这里是结束)

相关推荐
Ryan_Gosling12 分钟前
C++-构造函数-接口
开发语言·c++
ceffans21 分钟前
PDF文档中文本解析
c++·windows·pdf
SummerGao.27 分钟前
Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory
c++·windows·qt·cmake·visual studio·setup factory
仟濹32 分钟前
【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
c语言·c++·算法
YH_DevJourney1 小时前
Linux-C/C++《C/8、系统信息与系统资源》
linux·c语言·c++
Igallta_8136222 小时前
【小游戏】C++控制台版本俄罗斯轮盘赌
c语言·开发语言·c++·windows·游戏·游戏程序
在雨中6123 小时前
【找工作】C++和算法复习(自用)
c++·算法
攻城狮7号4 小时前
【第二节】C++设计模式(创建型模式)-抽象工厂模式
c++·设计模式·抽象工厂模式
天线枫枫4 小时前
QT- HTTP + JSON(还需完善)
c++·qt·http
天若有情6735 小时前
【数据结构】C++实现链表数据结构
数据结构·c++·链表