6、共享内存的基础数据结构

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        在开始关键的代码之前,需要先介绍一些基础数据结构,因为整套代码都建立在这些基础结构之上。当然你并不需要遵循这些,只是要理解后面的代码需要知道这些数据类型是什么。

        首先要记得任何带指针的结构都不能放在共享内存里,大约是所有的STL容器都不可以,所以我们要重新编写容器,而容器里的数据结构要有一定规范,方便统一操作。

        数据里面也不能使用string,我提供了静态的版本,sstring,详见我的相关文章。

目录

一、结构基类

二、结构示例

三、一个特例

四、一个辅助输出字符串的类


一、结构基类

        所有数据结构(数据记录、条目、单元)均继承自以下结构:

	struct CActiveObjectBase
	{
		//用于需要排序的场合
		bool operator < (CActiveObjectBase const& tmp)const { throw "operator < undefined"; return false; }

		//关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的
		long keyhash()const { throw "keyhash undefined"; return 0; }

		//用于输出数据的场合
		string& toString(string& str)const { throw "toString undefined"; return str; }

		//用于表格输出
		static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table) { return false; }
		bool AddTableData(CHtmlDoc::CHtmlTable2& table)const { return false; }
	};

        使用排序算法需要支持“operator <”,写算法的时候也可以用函数对象做参数,灵活性更大(但是最初写这个的时候我还不太会用函数对象)。

        如果需要提高并发能力,可以使用把一个数据分成多个块,用keyhash接口来区分。(这是由特定的容器来实现的)

        toString用的是引用参数,目的是防止内存泄漏,某些编译器的某些版本存在这个问题。当然也可以减少不必要的对象分配和释放,对性能影响也很大。 

        最后两个用来做表格输出,具体见我的相关文章。

二、结构示例

        这是一个例子:

	//T_DATA范例
	struct CDemoData : public CActiveObjectBase
	{
		long n = 0;

		//用于需要排序的场合
		bool operator < (CDemoData const& tmp)const { return n < tmp.n; }
		//某些场合也需要等于
		bool operator == (CDemoData const& tmp)const { return n == tmp.n; }

		friend ostream& operator << (ostream& o, CDemoData const& d)
		{
			return o << d.n;
		}
		//关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的
		long keyhash()const { return n; }

		//用于输出数据的场合
		string& toString(string& str)const
		{
			char buf[2048];
			sprintf(buf, "%ld", n);
			return str = buf;
		}
		//用于表格输出
		static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table)
		{
			table.AddCol("N", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);
			return true;
		}
		bool AddTableData(CHtmlDoc::CHtmlTable2& table)const
		{
			table.AddData(n);
			return true;
		}
	};

三、一个特例

        这是定义的单字节数据,其实,单字节数据放在共享内存里实在是太太太太浪费了(所需的辅助字节远远超过了有效数据)。

	struct CShmChar : public CActiveObjectBase
	{
		char c;

		//用于需要排序的场合
		bool operator < (CShmChar const& tmp)const { return c < tmp.c; }

		//关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的
		long keyhash()const { return c; }

		//用于输出数据的场合
		string& toString(string& str)const
		{
			char buf[2048];
			sprintf(buf, "%c", c);
			return str = buf;
		}
		//用于表格输出
		static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table)
		{
			table.AddCol("N", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);
			return true;
		}
		bool AddTableData(CHtmlDoc::CHtmlTable2& table)const
		{
			string str;
			table.AddData(toString(str));
			return true;
		}
	};

四、一个辅助输出字符串的类

        这个类能更方便地输出字符串:

	class CToString
	{
	public:
		string& operator()(long data, string& ret)
		{
			char buf[256];
			sprintf(buf, "%ld", data);
			return ret = buf;
		}
		template <typename T>
		string& operator()(T const& data, string& ret)
		{
			return data.toString(ret);
		}
	};

(这里是文档结束)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值